문자열을 정수로 형변환-Postgres


123

Varchar에 원시 피드가있는 테이블에서 데이터를 가져오고 있습니다. varchar의 열을 문자열 열로 가져와야합니다. <column_name>::integer뿐만 to_number(<column_name>,'9999999')아니라을 사용하려고 시도했지만 몇 개의 빈 필드가 있기 때문에 오류가 발생하므로 새 테이블에 비어 있거나 null로 검색해야합니다.

같은 기능이 있으면 알려주세요.


5
오류 메시지를 보여 주시겠습니까? 즉 도움이 될 것이다
프랭크 Heikens에게

답변:


126

와일드 추측 : 값이 빈 문자열 인 경우 NULLIF를 사용하여 NULL을 대체 할 수 있습니다.

SELECT
    NULLIF(your_value, '')::int

56

한 단계 더 나아가 다음과 같이 통합 된 필드를 제한 할 수도 있습니다.

SELECT CAST(coalesce(<column>, '0') AS integer) as new_field
from <table>
where CAST(coalesce(<column>, '0') AS integer) >= 10; 

28

빈 열을 NULLs 로 처리해야하는 경우 다음을 시도하십시오.

SELECT CAST(nullif(<column>, '') AS integer);

반면 NULL에 피해야 할 값 이있는 경우 다음을 시도하십시오.

SELECT CAST(coalesce(<column>, '0') AS integer);

동의합니다. 오류 메시지가 많이 도움이 될 것입니다.


25

NULL, 특수 문자 또는 빈 문자열로 인해 오류가 발생하지 않는 유일한 방법은 다음을 수행하는 것입니다.

SELECT REGEXP_REPLACE(COALESCE(<column>::character varying, '0'), '[^0-9]*' ,'0')::integer FROM table

2
나를 위해 (9.6.2) 이것이 유일한 일이었고 다른 모든 대답은 실패했습니다.
Jasper de Vries

2
추가 할 수 WHERE <column> != NULL없습니까?
Matthieu

14

Lukas의 게시물에 댓글을 달 수 없습니다 (평판이 너무 적습니까? 저는 꽤 새롭습니다).

내 PG 설정에서 to_number(NULL)작동하지 않으므로 내 솔루션은 다음과 같습니다.

SELECT CASE WHEN column = NULL THEN NULL ELSE column :: Integer END
FROM table

1
이것은 작동하지만 덜 장황한 NULLIF()접근 방식 과 정확히 동일해야합니다 . 표준은 실제로 NULLIF를 CASE 술어의 한 형태로 정의합니다.
kgrittn

13

값에 숫자가 아닌 문자가 포함 된 경우 다음과 같이 값을 정수로 변환 할 수 있습니다.

SELECT CASE WHEN <column>~E'^\\d+$' THEN CAST (<column> AS INTEGER) ELSE 0 END FROM table;

CASE 연산자는 <column>을 확인하여 정수 패턴과 일치하면 비율을 정수로 변환하고 그렇지 않으면 0을 반환합니다.



1

일반적인 문제

순진하게 문자열을 정수로 캐스팅하는 유형

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.