PostgreSQL wählt leere Felder vom Typ Integer aus

12

Ich habe eine Tabelle und muss alle Zeilen mit einem leeren Wert für das fk_fc_idFeld auswählen (als Vorspiel zum Löschen).

    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)

Dies funktioniert jedoch nicht,

# 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="";
                                                                    ^

Der Versuch Nullfunktioniert auch nicht.

Wenn jemand Vorschläge hat, wie man das sortiert, wäre ich sehr dankbar.

James
quelle
1
wähle fk_fc_id, di_timestamp, di_item_value aus data_item aus, wobei fk_fc_id null ist
foibs
2
Doppelte Anführungszeichen werden in PostgreSQL nicht für Zeichenfolgen verwendet. Für Zeichenfolgen werden einfache Anführungszeichen verwendet. Aber Sie sollten keine Zeichenfolgen mit der Länge Null mit ganzen Zahlen vergleichen! Der Vergleich von Werten mit der nullVerwendung des =Operators gibt immer zurück nullund führt dazu, dass diese Zeile ausgeschlossen wird.
Colin 't Hart

Antworten:

20

Dies betrifft weder die Datenbankverwaltung noch PostgreSQL, aber wie @foibs antwortete, sollten Sie sich IS NULL ansehen :

 SELECT fk_fc_id,
        di_timestamp,
        di_item_value  
 FROM data_item  
 WHERE fk_fc_id IS NULL
KookieMonster
quelle
1
Ah, ich habe versucht = Null anstatt Null zu sein. Vielen Dank
James
Beide (=; IS) funktionieren gut in 9.4
Petr
0

Sie müssen einfache Anführungszeichen verwenden:

SELECT fk_fc_id,
        di_timestamp,
        di_item_value  
 FROM data_item  
 WHERE fk_fc_id=''
Clara
quelle
Technisch gesehen haben Sie Recht, eine Zeichenfolge in SQL sollte in einfache Anführungszeichen gesetzt werden. In diesem speziellen Fall sollte das OP jedoch nicht mit einem String (leer oder nicht) verglichen werden, da die betreffende Spalte als definiert ist integer. Wie Sie in den Kommentaren unter der akzeptierten Antwort nachlesen können, hat sich das OP entschlossen, einen Vergleich mit einer leeren Zeichenfolge durchzuführen, nur weil es nicht herausgefunden hatte, wie es richtig mit null verglichen werden kann (was genau das ist, wonach es eigentlich gesucht wurde).
Andriy M