typecast string - tam sayı


123

Varchar'da ham beslemeleri olan bir tablodan veri içe aktarıyorum, varchar'daki bir sütunu bir dize sütununa aktarmam gerekiyor. <column_name>::integerYanı sıra kullanmayı denedim to_number(<column_name>,'9999999')ama hatalar alıyorum, çünkü birkaç boş alan var, bunları yeni tabloya boş veya boş olarak geri getirmem gerekiyor.

Aynı işlevi olup olmadığını lütfen bana bildirin.


5
Bize hata mesajını gösterebilir misiniz? Bu yardımcı olur
Frank Heikens

Yanıtlar:


126

Çılgın tahmin: Değeriniz boş bir dizeyse, NULL yerine NULLIF kullanabilirsiniz:

SELECT
    NULLIF(your_value, '')::int

56

Hatta bir daha ileri gidebilir ve bu birleşik alanda, örneğin: -

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

28

Boş sütunlara ' NULLler olarak davranmanız gerekiyorsa , şunu deneyin:

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

Öte yandan, NULLkaçınmanız gereken değerleriniz varsa şunları deneyin:

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

Kabul ediyorum, hata mesajı çok yardımcı olur.


25

NULL veya özel karakterler veya boş dizeler nedeniyle bir hata yapmamayı başarmanın tek yolu şunu yapmaktır:

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

2
Benim için (9.6.2) işe yarayan tek şey buydu, diğer tüm cevaplar başarısız oldu.
Jasper de Vries

2
Bir ekleyemez WHERE <column> != NULLmisin?
Matthieu

14

Lukas'ın gönderisine yorum yapamıyorum (çok az itibar mı? Oldukça yeniyim).

PG kurulumumda to_number(NULL)çalışmıyor, bu yüzden çözümüm şöyle olurdu:

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

1
Bu işe yaramalı, ancak daha az ayrıntılı NULLIF()yaklaşımla tam olarak eşdeğer olmalıdır . Standart aslında NULLIF'i CASE yükleminin bir biçimi olarak tanımlar.
kgrittn

13

Değer sayısal olmayan karakterler içeriyorsa, değeri aşağıdaki gibi bir tam sayıya dönüştürebilirsiniz:

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

CASE operatörü <sütun> 'u kontrol eder, tamsayı modeliyle eşleşirse, oranı bir tam sayıya dönüştürür, aksi takdirde 0 döndürür



1

Yaygın sorun

Herhangi bir dizeyi böyle bir tam sayıya çeviren saf bir şekilde

SELECT ''::integer

Genellikle ünlü hatanın sonucu:

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

Sorun

PostgreSQL, herhangi bir dizeyi bir tamsayıya güvenli bir şekilde çevirmek için önceden tanımlanmış bir işleve sahip değildir .

Çözüm

PHP'nin intval () işlevinden esinlenerek kullanıcı tanımlı bir işlev oluşturun .

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;

kullanım

/* 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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.