2016-05-18 12 views
0

Ich habe eine Tabelle in PostgreSQL 9.5 erstellt, wie unten gezeigt, und ich habe einige Daten hinzugefügt. Wenn ich jedoch versuche, Daten nach Groß- und Kleinschreibung zu suchen, wie z. B.! ~ *, Werden sogar die Nullwertzeilen entfernt. Wie kann ich eine Abfrage durchführen, die alle Kategorien zurückgibt, die Null und Gemüse, aber keine Früchte sind?PostgreSQL-Abfrage nach String filtert sogar die Werte, bei denen Nullen vorhanden sind.

CREATE TABLE temp 
(
    category character varying, 
    item character varying 
); 

INSERT INTO temp VALUES('Fruits', 'apple'); 
INSERT INTO temp VALUES('FRUITS', 'applE'); 
INSERT INTO temp(item) VALUES('Apple'); 
INSERT INTO temp(item) VALUES('BANANA'); 
INSERT INTO temp VALUES('Vegetables', 'Cabbage'); 

Abfrage

Select * from temp where category !~* 'fruits' 

Ausgabe

category item 
-------- -------- 
Vegetables Cabbage 

Antwort

1

Um mit der Null umgehen können Sie is distinct from verwenden:

Select * 
from temp 
where lower(category) is distinct from 'fruits' 

oder wenn Sie den regulären Ausdruck wollen:

Select * 
from temp 
where category !~* 'fruits' 
    or category is null; 

alternativ null als etwas behandeln anderes:

Select * 
from temp 
where coalesce(category, '') !~* 'fruits' 
+0

Allerdings, wenn ich zu nisten versucht und/oder sich die Abfrage diese Nullen verschwinden. In diesem Fall zum Beispiel: Wählen Sie * aus ( Select * von Temp wo Kategorie ~ * 'Früchte' oder Kategorie null ist!) "T" wo "Kategorie" ~ * 'Gemüse' – codeBarer

+0

Allerdings, wenn ich! sie verschmelzen dann funktioniert es: * Wählen sie aus ' "t" wo coalesce ("Kategorie", ( ') ~ Select * von Temp wo coalesce (Kategorie 'Früchte') ~ *!')'! * 'Gemüse' – codeBarer