PostgreSQL wybiera puste pola typu liczba całkowita

13

Mam tabelę i muszę wybrać wszystkie wiersze z pustą wartością dla fk_fc_idpola (jako preludium do ich usunięcia),

    Column     |            Type             |                         Modifiers
---------------+-----------------------------+------------------------------------------------------------
 di_timestamp  | timestamp without time zone |
 di_item_value | character varying(10)       |
 fk_fc_id      | integer                     |
 di_id         | integer                     | not null default nextval('data_item_di_id_seq1'::regclass)

Jednak to nie działa,

# select fk_fc_id,di_timestamp,di_item_value from data_item where fk_fc_id="";
ERROR:  zero-length delimited identifier at or near """"
LINE 1: ...di_timestamp,di_item_value from data_item where fk_fc_id="";
                                                                    ^

Próbowanie Nullteż nie działa.

Byłbym bardzo wdzięczny, gdyby ktoś miał jakieś sugestie, jak to rozwiązać.

James
źródło
1
wybierz fk_fc_id, di_timestamp, di_item_value z data_item, gdzie fk_fc_id ma wartość null
foibs
2
Podwójne cudzysłowy nie są używane w przypadku ciągów znaków w PostgreSQL. Pojedyncze ciągi są używane jako ciągi znaków. Ale nie powinieneś porównywać ciągów o zerowej długości z liczbami całkowitymi! Porównanie wartości za nullpomocą =operatora zawsze zwróci nulli spowoduje wykluczenie tego wiersza.
Colin 't Hart

Odpowiedzi:

21

To nie jest tak naprawdę związane z administrowaniem bazą danych, ani tak naprawdę nie dotyczy PostgreSQL, ale jak na @foibs odpowiedział, powinieneś spojrzeć na IS NULL :

 SELECT fk_fc_id,
        di_timestamp,
        di_item_value  
 FROM data_item  
 WHERE fk_fc_id IS NULL
KookieMonster
źródło
1
Ach, próbowałem = Null zamiast Null. Dzięki,
James
Oba (=; IS) działa dobrze w 9.4
Petr
0

Musisz użyć pojedynczego cytatu:

SELECT fk_fc_id,
        di_timestamp,
        di_item_value  
 FROM data_item  
 WHERE fk_fc_id=''
Clara
źródło
Technicznie rzecz biorąc, masz rację, ciąg znaków w SQL powinien być oddzielany pojedynczymi cudzysłowami. Jednak w tym konkretnym przypadku OP nie powinien w pierwszej kolejności porównywać łańcucha (pustego lub nie), ponieważ kolumna jest zdefiniowana jako integer. Jak można przeczytać w komentarzach pod przyjętą odpowiedzią, OP zdecydował się na porównanie z pustym ciągiem znaków tylko dlatego, że nie wymyślił, jak poprawnie porównać z wartością zerową (po co tak naprawdę chcieli).
Andriy M,