文字列を整数に型キャスト-Postgres


122

Varcharの未加工フィードを持つテーブルからデータをインポートしています。varcharの列を文字列列にインポートする必要があります。<column_name>::integer同様にを使用してto_number(<column_name>,'9999999')みましたが、エラーが発生しました。空のフィールドがいくつかあるため、新しいテーブルに空またはnullとして取得する必要があります。

同じ機能があるかどうか教えてください。


5
エラーメッセージを見せていただけますか?それは役に立ちます
フランク・ハイケンズ

回答:


124

ワイルドな推測:値が空の文字列の場合、NULLIFを使用してNULLに置き換えることができます。

SELECT
    NULLIF(your_value, '')::int

55

あなたはさらに進んで、たとえばこのような合体したフィールドを制限することもできます:-

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

27

空の列をNULLs として扱う必要がある場合は、次のことを試してください。

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

一方、NULL回避する必要がある値がある場合は、以下を試してください。

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

私は同意します、エラーメッセージは大いに役立ちます。


24

NULL、特殊文字、空の文字列が原因でエラーが発生しない唯一の方法は、次のようにすることです。

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

2
私(9.6.2)にとっては、これが機能する唯一の方法であり、他のすべての回答は失敗しました。
Jasper de Vries、2017

2
追加できませんWHERE <column> != NULLか?
Matthieu

13

Lukasの投稿にコメントできない(評判が少なすぎる?私はかなり新しい)。

私のPG設定でto_number(NULL)は機能しないので、私の解決策は次のようになります。

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

1
これは機能するはずですが、冗長性の低いNULLIF()アプローチとまったく同じです。標準では、実際にはNULLIFをCASE述語の形式として定義しています。
kgrittn

12

値に数値以外の文字が含まれている場合は、次のように値を整数に変換できます。

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

CASE演算子は<column>をチェックし、それが整数パターンに一致する場合、レートを整数に変換し、そうでない場合、0を返します



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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.