Bazą danych jest Postgres
Czy mogę użyć wartości NULL dla klauzuli IN? przykład:
SELECT *
FROM tbl_name
WHERE id_field IN ('value1', 'value2', 'value3', NULL)
Chcę ograniczyć się do tych czterech wartości.
Wypróbowałem powyższą instrukcję i nie działa, cóż, wykonuje, ale nie dodaje rekordów z NULL id_fields.
Próbowałem również dodać warunek LUB, ale to po prostu sprawia, że zapytanie jest uruchamiane i uruchamiane bez końca.
SELECT *
FROM tbl_name
WHERE other_condition = bar
AND another_condition = foo
AND id_field IN ('value1', 'value2', 'value3')
OR id_field IS NULL
Jakieś sugestie?
sql
postgresql
null
conditional-statements
in-clause
Phill Pafford
źródło
źródło
in
Oświadczenie będzie analizowany identyczniefield=val1 or field=val2 or field=val3
. Umieszczenie tam wartości zerowej sprowadzi się do tego,field=null
co nie zadziała.where
klauzuli?Odpowiedzi:
( Komentarz przez Marc B )
Zrobiłbym to dla jasności
SELECT * FROM tbl_name WHERE (id_field IN ('value1', 'value2', 'value3') OR id_field IS NULL)
źródło
Twoje zapytanie nie powiodło się z powodu pierwszeństwa operatorów .
AND
wiąże się wcześniejOR
!Potrzebujesz pary nawiasów, co nie jest kwestią „jasności”, ale czystą logiczną koniecznością .
SELECT * FROM tbl_name WHERE other_condition = bar AND another_condition = foo AND (id_field IN ('value1', 'value2', 'value3') OR id_field IS NULL)
Dodane nawiasy zapobiegają
AND
wcześniejszemu wiązaniuOR
. Gdyby nie było innychWHERE
warunków (nieAND
), nie potrzebowałbyś nawiasów. Przyjęta odpowiedź jest pod tym względem nieco myląca.źródło
SELECT * FROM tbl_name WHERE coalesce(id_field,'unik_null_value') IN ('value1', 'value2', 'value3', 'unik_null_value')
Aby wyeliminować zero z czeku. Biorąc pod uwagę wartość null w id_field, funkcja łączenia zamiast null zwróciłaby „unik_null_value”, a dodając „unik_null_value do listy IN-lista, zapytanie zwróciłoby posty, w których id_field ma wartość 1-3 lub null.
źródło
Pytanie, na które odpowiedział Daniel, jest całkowicie w porządku. Chciałem zostawić notatkę dotyczącą wartości NULLS. Należy zachować ostrożność przy używaniu operatora NOT IN, gdy kolumna zawiera wartości NULL. Nie otrzymasz żadnych danych wyjściowych, jeśli kolumna zawiera wartości NULL i używasz operatora NOT IN. Oto jak to zostało wyjaśnione tutaj http://www.oraclebin.com/2013/01/beware-of-nulls.html , bardzo dobry artykuł, na który natknąłem się i pomyślałem o udostępnieniu go.
źródło
Uwaga: Ponieważ w odpowiedzi Sushant Butta ktoś twierdził, że link zewnętrzny jest martwy , opublikowałem tutaj treść jako oddzielną odpowiedź.
Uważaj na NULLS .
Dzisiaj natknąłem się na bardzo dziwne zachowanie zapytania podczas używania IN i
NOT IN
operatorów. Właściwie chciałem porównać dwie tabele i dowiedzieć się, czy wartość ztable b
istniała w,table a
czy nie, i dowiedzieć się, jak zachowuje się, jeśli kolumna zawieranull
wartości. Dlatego właśnie stworzyłem środowisko do testowania tego zachowania.Stworzymy tabelę
table_a
.SQL> create table table_a ( a number); Table created.
Stworzymy tabelę
table_b
.SQL> create table table_b ( b number); Table created.
Wstaw niektóre wartości do
table_a
.SQL> insert into table_a values (1); 1 row created. SQL> insert into table_a values (2); 1 row created. SQL> insert into table_a values (3); 1 row created.
Wstaw niektóre wartości do
table_b
.SQL> insert into table_b values(4); 1 row created. SQL> insert into table_b values(3); 1 row created.
Teraz wykonamy zapytanie, aby sprawdzić istnienie wartości
table_a
, sprawdzając jej wartośćtable_b
za pomocąIN
operatora.SQL> select * from table_a where a in (select * from table_b); A ---------- 3
Wykonaj poniższe zapytanie, aby sprawdzić, czy nie istnieje.
SQL> select * from table_a where a not in (select * from table_b); A ---------- 1 2
Wynik przyszedł zgodnie z oczekiwaniami. Teraz wstawimy
null
wartość do tabelitable_b
i zobaczymy, jak zachowują się powyższe dwa zapytania.SQL> insert into table_b values(null); 1 row created. SQL> select * from table_a where a in (select * from table_b); A ---------- 3 SQL> select * from table_a where a not in (select * from table_b); no rows selected
Pierwsze zapytanie zachowało się zgodnie z oczekiwaniami, ale co się stało z drugim zapytaniem? Dlaczego nie otrzymaliśmy żadnych wyników, co powinno się stać? Czy jest jakaś różnica w zapytaniu? Nie .
Zmiana jest w danych tabeli
table_b
. Wprowadziliśmynull
wartość do tabeli. Ale dlaczego tak się zachowuje? Podzielmy dwa zapytania na"AND"
i"OR"
operator.Pierwsze zapytanie:
Pierwsze zapytanie będzie obsługiwane wewnętrznie, mniej więcej w ten sposób. Więc a
null
nie spowoduje tutaj problemu, ponieważ moje pierwsze dwa operandy będą obliczane natrue
lubfalse
. Ale mój trzeci operanda = null
nie będzie obliczany dotrue
anifalse
. Oceninull
tylko.select * from table_a whara a = 3 or a = 4 or a = null; a = 3 is either true or false a = 4 is either true or false a = null is null
Drugie zapytanie:
Drugie zapytanie zostanie obsłużone jak poniżej. Ponieważ używamy
"AND"
operatora i wszystko inne niżtrue
w którymkolwiek z operandów nie da mi żadnego wyniku.select * from table_a whara a <> 3 and a <> 4 and a <> null; a <> 3 is either true or false a <> 4 is either true or false a <> null is null
Jak więc sobie z tym radzimy? Wszystkie
not null
wartości z tabeli wybierzemytable_b
używającNOT IN
operatora.SQL> select * from table_a where a not in (select * from table_b where b is not null); A ---------- 1 2
Dlatego zawsze uważaj na
NULL
wartości w kolumnie podczas używaniaNOT IN
operatora.Uważaj na NULL !!
źródło
Wiem, że jest późno na odpowiedź, ale może być przydatna dla kogoś innego. Możesz użyć zapytania podrzędnego i przekonwertować wartość null na 0
SELECT * FROM (SELECT CASE WHEN id_field IS NULL THEN 0 ELSE id_field END AS id_field FROM tbl_name) AS tbl WHERE tbl.id_field IN ('value1', 'value2', 'value3', 0)
źródło
Null
odnosi się do braku danych.Null
jest formalnie zdefiniowana jako wartość niedostępna, nieprzypisana, nieznana lub niemożliwa do zastosowania (OCA Oracle Database 12c, SQL Fundamentals I Exam Guide, str. 87). Dlatego możesz nie widzieć rekordów z kolumnami zawierającymi wartości null, gdy te kolumny są ograniczone za pomocą klauzul „in” lub „not in”.źródło