PostgreSQL sélectionne des champs vides de type entier


13

J'ai une table et je dois sélectionner toutes les lignes avec une valeur vide pour le fk_fc_idchamp (en prélude à leur suppression),

    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)

Mais cela ne fonctionne pas,

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

Essayer Nullne fonctionne pas non plus.

Si quelqu'un a des suggestions sur la façon de trier cela, je vous en serais très reconnaissant.


1
sélectionnez fk_fc_id, di_timestamp, di_item_value dans data_item où fk_fc_id est null
foibs

2
Les guillemets doubles ne sont pas utilisés pour les chaînes dans PostgreSQL. Des guillemets simples sont utilisés pour les chaînes. Mais vous ne devriez pas comparer des chaînes de longueur nulle à des entiers! Et la comparaison des valeurs avec l' nullutilisation de l' =opérateur renverra toujours nullet entraînera l'exclusion de cette ligne.
Colin 't Hart

Réponses:


21

Ce n'est pas vraiment lié à l'administration de la base de données, ni à PostgreSQL, mais comme @foibs a répondu, vous devriez jeter un œil à IS NULL :

 SELECT fk_fc_id,
        di_timestamp,
        di_item_value  
 FROM data_item  
 WHERE fk_fc_id IS NULL

1
Ah, j'essayais = Null plutôt que Null. Merci,
James

Les deux (=; IS) fonctionnent bien en 9.4
Petr

0

Vous devez utiliser un guillemet simple:

SELECT fk_fc_id,
        di_timestamp,
        di_item_value  
 FROM data_item  
 WHERE fk_fc_id=''

Techniquement, vous avez raison, une chaîne en SQL doit être délimitée par des guillemets simples. Cependant, dans ce cas spécifique, l'OP ne doit pas être comparé à une chaîne (vide ou non) en premier lieu, car la colonne en question est définie comme integer. Comme vous pouvez le lire dans les commentaires sous la réponse acceptée, l'OP a décidé d'essayer la comparaison avec une chaîne vide uniquement parce qu'ils n'avaient pas compris comment comparer correctement à null (ce qu'ils recherchaient en fait).
Andriy M
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.