typecast string menjadi integer - Postgres

123

Saya mengimpor data dari tabel yang memiliki umpan mentah di Varchar, saya perlu mengimpor kolom di varchar ke dalam kolom string. Saya mencoba menggunakan <column_name>::integerjugato_number(<column_name>,'9999999') tetapi saya mendapatkan kesalahan, karena ada beberapa bidang kosong, saya perlu mengambilnya sebagai kosong atau nol ke tabel baru.

Mohon beri tahu saya jika ada fungsi untuk hal yang sama.

Vijay DJ
sumber
5
Bisakah Anda menunjukkan kepada kami pesan kesalahan? Itu akan membantu
Frank Heikens

Jawaban:

126

Tebakan liar: Jika nilai Anda adalah string kosong, Anda dapat menggunakan NULLIF untuk menggantinya dengan NULL:

SELECT
    NULLIF(your_value, '')::int
Frank Heikens
sumber
56

Anda bahkan dapat melangkah lebih jauh dan membatasi bidang gabungan ini seperti, misalnya: -

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

Jika Anda perlu memperlakukan kolom kosong sebagai NULLs, coba ini:

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

Di sisi lain, jika Anda memang memiliki NULLnilai yang perlu Anda hindari, cobalah:

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

Saya setuju, pesan kesalahan akan banyak membantu.

vyegorov
sumber
25

Satu-satunya cara agar saya tidak mengalami kesalahan karena NULL, atau karakter khusus atau string kosong adalah dengan melakukan ini:

SELECT REGEXP_REPLACE(COALESCE(<column>::character varying, '0'), '[^0-9]*' ,'0')::integer FROM table
Charles Hamel
sumber
2
Bagi saya (9.6.2) ini adalah satu-satunya hal yang berhasil, semua jawaban lainnya gagal.
Jasper de Vries
2
Tidak bisakah Anda menambahkan WHERE <column> != NULL?
Matthieu
14

Saya tidak dapat berkomentar (reputasi terlalu kecil? Saya cukup baru) tentang posting Lukas.

Pada pengaturan PG saya to_number(NULL)tidak berfungsi, jadi solusi saya adalah:

SELECT CASE WHEN column = NULL THEN NULL ELSE column :: Integer END
FROM table
niko
sumber
1
Ini seharusnya berhasil, tetapi harus sama persis dengan NULLIF()pendekatan yang kurang bertele-tele . Standar sebenarnya mendefinisikan NULLIF sebagai bentuk predikat CASE.
kgrittn
13

Jika nilai mengandung karakter non-numerik, Anda dapat mengonversi nilai menjadi integer sebagai berikut:

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

Operator CASE memeriksa <kolom>, jika cocok dengan pola bilangan bulat, ia mengubah tarif menjadi bilangan bulat, jika tidak ia mengembalikan 0

Igor Ostrovsky
sumber
1

Anda dapat menggunakan kueri ini

SUM(NULLIF(conversion_units, '')::numeric)
Abdul Quadir
sumber
1

Masalah umum

Ketikkan casting string apa pun secara naif menjadi integer seperti itu

SELECT ''::integer

Seringkali hasil dari kesalahan terkenal:

Query failed: ERROR: invalid input syntax for integer: ""

Masalah

PostgreSQL tidak memiliki fungsi yang telah ditentukan sebelumnya untuk aman mengetikkan string apa pun ke dalam integer.

Larutan

Buat fungsi yang ditentukan pengguna yang terinspirasi oleh fungsi intval () PHP .

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;

Pemakaian

/* 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
Abel Callejo
sumber