programing

정수로 캐스트 문자열 입력

starjava 2023. 5. 7. 10:45
반응형

정수로 캐스트 문자열 입력

Varchar의 원시 피드가 있는 테이블에서 데이터를 가져오고 있습니다. Varchar의 열을 문자열 열로 가져와야 합니다.사용해 보았습니다.<column_name>::integer게다가to_number(<column_name>,'9999999')그러나 오류가 발생합니다. 빈 필드가 몇 개 있기 때문에 새 테이블에 빈 필드 또는 null로 검색해야 합니다.

어림짐작:값이 빈 문자열인 경우 NULLIF를 사용하여 NULL로 바꿀 수 있습니다.

SELECT
    NULLIF(your_value, '')::int

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

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

빈 열을 다음과 같이 처리해야 하는 경우NULLs, 사용해 보십시오.

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

반면에, 만약 당신이 가지고 있다면.NULL피해야 할 값은 다음과 같습니다.

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

동의합니다, 오류 메시지가 많은 도움이 될 것 같습니다.

NULL이나 특수 문자 또는 빈 문자열 때문에 오류가 발생하지 않는 유일한 방법은 다음과 같습니다.

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

저는 논평할 수 없습니다. (너무 적은 평판입니까?)나는 루카스의 게시물에 꽤 새로 왔어요.

내 PG 설정에서to_number(NULL)작동하지 않으므로 제 해결책은 다음과 같습니다.

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

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

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의 inval() 함수에서 영감을 받은 사용자 정의 함수를 만듭니다.

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

이 쿼리를 사용할 수 있습니다.

SUM(NULLIF(conversion_units, '')::numeric)

나에게 완벽한 해결책은 사용하는 것입니다.nullif그리고.regexp_replace

SELECT NULLIF(REGEXP_REPLACE('98123162t3712t37', '[^0-9]', '', 'g'), '')::bigint;

위의 솔루션은 다음과 같은 에지 사례를 고려합니다.

  1. String and Number(문자열 및 숫자): 오직regexp_replace함수는 정수로 완벽하게 변환됩니다.
SELECT NULLIF(REGEXP_REPLACE('string and 12345', '[^0-9]', '', 'g'), '')::bigint;
  1. 문자열만:regexp_replace문자열이 아닌 문자를 빈 문자열로 변환합니다. 이 문자열은 정수로 직접 캐스팅할 수 없으므로 사용합니다.nullifnull로 변환합니다.
SELECT NULLIF(REGEXP_REPLACE('only string', '[^0-9]', '', 'g'), '')::bigint;
  1. 정수 범위:문자열을 정수로 변환하면 정수 유형 오류의 범위를 벗어날 수 있습니다.그러니깐 사용bigint대신
SELECT NULLIF(REGEXP_REPLACE('98123162t3712t37', '[^0-9]', '', 'g'), '')::bigint;

열에 소수점이 있는 경우

select NULLIF('105.0', '')::decimal

이것은 나에게 도움이 됩니다.

select (left(regexp_replace(coalesce('<column_name>', '0') || '', '[^0-9]', '', 'g'), 8) || '0')::integer

쉽게 보기 위해:

select (
    left(
        regexp_replace(
            -- if null then '0', and convert to string for regexp
            coalesce('<column_name>', '0') || '',
            '[^0-9]',
            '',
            'g'
        ),      -- remove everything except numbers
        8       -- ensure ::integer doesn't overload
    ) || '0'    -- ensure not empty string gets to ::integer
)::integer

언급URL : https://stackoverflow.com/questions/10518258/typecast-string-to-integer

반응형