typecast string na integer - Postgres


123

Importuję dane z tabeli, która ma surowe kanały w Varchar, muszę zaimportować kolumnę w varchar do kolumny ciągów. Próbowałem użyć, <column_name>::integerjak również, to_number(<column_name>,'9999999')ale otrzymuję błędy, ponieważ jest kilka pustych pól, muszę je pobrać jako puste lub zerowe do nowej tabeli.

Uprzejmie daj mi znać, jeśli istnieje funkcja dla tego samego.


5
Czy możesz pokazać nam komunikat o błędzie? To by pomogło
— Frank Heikens

Odpowiedzi:


126

Dzikie przypuszczenie: jeśli wartość jest pustym ciągiem, możesz użyć NULLIF, aby zastąpić ją wartością NULL:

SELECT
    NULLIF(your_value, '')::int

56

Możesz nawet pójść dalej i ograniczyć na tym zlewającym się polu, na przykład: -

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

28

Jeśli chcesz traktować puste kolumny jako NULLs, spróbuj tego:

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

Z drugiej strony, jeśli masz NULLwartości, których musisz unikać, spróbuj:

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

Zgadzam się, komunikat o błędzie bardzo by pomógł.


25

Jedynym sposobem, w jaki mogę nie mieć błędu z powodu NULL, znaków specjalnych lub pustego ciągu, jest zrobienie tego:

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

2
Dla mnie (9.6.2) to była jedyna rzecz, która działała, wszystkie inne odpowiedzi zawiodły.
— Jasper de Vries

2
Nie mógłbyś dodać WHERE <column> != NULL?
— Matthieu

14

Nie jestem w stanie skomentować (zbyt mała reputacja? Jestem całkiem nowy) pod postem Lukasa.

Na mojej konfiguracji PG to_number(NULL)nie działa, więc moim rozwiązaniem byłoby:

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

1
To powinno działać, ale powinno być dokładnym odpowiednikiem mniej szczegółowego NULLIF()podejścia. Standard faktycznie definiuje NULLIF jako formę predykatu CASE.
— kgrittn

13

Jeśli wartość zawiera znaki nieliczbowe, możesz przekonwertować wartość na liczbę całkowitą w następujący sposób:

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

Operator CASE sprawdza <kolumnę>, jeśli pasuje do wzorca liczby całkowitej, konwertuje stawkę na liczbę całkowitą, w przeciwnym razie zwraca 0



1

Powszechny problem

Naiwnie typ rzutujący dowolny ciąg na liczbę całkowitą, taką jak ta

SELECT ''::integer

Często prowadzi do słynnego błędu:

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

Problem

PostgreSQL nie ma predefiniowanej funkcji do bezpiecznego rzutowania dowolnego ciągu znaków na liczbę całkowitą.

Rozwiązanie

Utwórz funkcję zdefiniowaną przez użytkownika zainspirowaną funkcją 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;

Stosowanie

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.