답변:
NULL, 특수 문자 또는 빈 문자열로 인해 오류가 발생하지 않는 유일한 방법은 다음을 수행하는 것입니다.
SELECT REGEXP_REPLACE(COALESCE(<column>::character varying, '0'), '[^0-9]*' ,'0')::integer FROM table
WHERE <column> != NULL
없습니까?
값에 숫자가 아닌 문자가 포함 된 경우 다음과 같이 값을 정수로 변환 할 수 있습니다.
SELECT CASE WHEN <column>~E'^\\d+$' THEN CAST (<column> AS INTEGER) ELSE 0 END FROM table;
CASE 연산자는 <column>을 확인하여 정수 패턴과 일치하면 비율을 정수로 변환하고 그렇지 않으면 0을 반환합니다.
순진하게 문자열을 정수로 캐스팅하는 유형
SELECT ''::integer
종종 유명한 오류가 발생합니다.
Query failed: ERROR: invalid input syntax for integer: ""
PostgreSQL에는 문자열을 정수로 안전하게 형변환 하기위한 미리 정의 된 함수가 없습니다 .
PHP의 intval () 함수 에서 영감을받은 사용자 정의 함수를 만듭니다 .
CREATE FUNCTION intval(character varying) RETURNS integer AS $$
SELECT
CASE
WHEN length(btrim(regexp_replace($1, '[^0-9]', '','g')))>0 THEN btrim(regexp_replace($1, '[^0-9]', '','g'))::integer
ELSE 0
END AS intval;
$$
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
/* Example 1 */
SELECT intval('9000');
-- output: 9000
/* Example 2 */
SELECT intval('9gag');
-- output: 9
/* Example 3 */
SELECT intval('the quick brown fox jumps over the lazy dog');
-- output: 0
모든 문자열을 정수로 캐스팅하는 데 2 센트 :
SELECT REGEXP_REPLACE('0' || "<column>", '[[:alpha:]]', '', 'g')::int