정수로 캐스트 문자열 입력
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;
빈 열을 다음과 같이 처리해야 하는 경우NULL
s, 사용해 보십시오.
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;
위의 솔루션은 다음과 같은 에지 사례를 고려합니다.
- String and Number(문자열 및 숫자): 오직
regexp_replace
함수는 정수로 완벽하게 변환됩니다.
SELECT NULLIF(REGEXP_REPLACE('string and 12345', '[^0-9]', '', 'g'), '')::bigint;
- 문자열만:
regexp_replace
문자열이 아닌 문자를 빈 문자열로 변환합니다. 이 문자열은 정수로 직접 캐스팅할 수 없으므로 사용합니다.nullif
null로 변환합니다.
SELECT NULLIF(REGEXP_REPLACE('only string', '[^0-9]', '', 'g'), '')::bigint;
- 정수 범위:문자열을 정수로 변환하면 정수 유형 오류의 범위를 벗어날 수 있습니다.그러니깐 사용
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
'programing' 카테고리의 다른 글
Bash에서 지정된 시간 초과 후 하위 프로세스를 종료하는 방법은 무엇입니까? (0) | 2023.05.07 |
---|---|
탐색 모음에서 뒤로 단추 색 변경 (0) | 2023.05.07 |
postgresql로 "무시 삽입" 및 "중복 키 업데이트 시"(sql 병합)를 에뮬레이트하는 방법은 무엇입니까? (0) | 2023.05.07 |
"모호한 리디렉션" 오류를 가져오는 중 (0) | 2023.05.07 |
예외가 있는 Python 유형 암시 (0) | 2023.05.07 |