Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

Na pewno chodzi o cos bajecznie prostego, ale jakos nie potrafie dostrzec przyczyny, moze pomozecie? :)

Oto wyciag z tabeli:


resourceid longname site statuscode activitycode projectclass days
---------------------- -------------------------------------------------------------------------
ADAMCLARKE Adam Clarke INTERNATIONAL A WORK SER 14.40
ADAMCLARKE Adam Clarke INTERNATIONAL A WORK SER 9.33
ADAMLCLARKE Adam Clarke INTERNATIONAL E null INT 1.47


To SQL jaki na niej wykonuje (czesc wiekszego selecta, ale akurat ta czesc nie dziala):


select resourceid, longname, sum(days) days
from tabela
where statuscode <> 'R'
and projectclass in ('INT','NON')
and activitycode not in ('PTO', 'Holiday','SICK','CTO','APPTRAIN')
group by resourceid, longname

(0 row(s) affected)


Dlaczego zero? Zapytanie uwala ta linia:
and activitycode not in ('PTO', 'Holiday','SICK','CTO','APPTRAIN')

IMO jesli wiersz jest null to zdecydowanie nie znajduje sie na tej liscie. Problem rozwiazuje podmienie null w activitycode na jakas wartosc, wiec obejscie probemu nie sprawia klopotow, ale nie rozumiem czemu zapytanie dziala tak a nie inaczej.?

W books online nie ma zadnej informacji o NOT IN zachowujacym sie jakos odmiennie dla nulli.Bartosz S edytował(a) ten post dnia 03.06.09 o godzinie 13:51

konto usunięte

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

Bartosz S:
W books online nie ma zadnej informacji o NOT IN zachowujacym sie jakos odmiennie dla nulli.

No a dodaj

and (activitycode not in ('PTO', 'Holiday','SICK','CTO','APPTRAIN') or activitycode is null)

Prawda pewnie leży "pomiędzy wierszami" :)Krzysztof P. edytował(a) ten post dnia 03.06.09 o godzinie 13:54
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

Ok, ale mnie nie chodzi o to, zeby wylapac wszystko co jest nullem (jak jest nullem to oczywiste, ze nie jest cala reszta).

Dajac warunek na nulla pozbywam sie wszystkiego co nim nie jest.Bartosz S edytował(a) ten post dnia 03.06.09 o godzinie 14:06
Łukasz Schabek

Łukasz Schabek Architekt Rozwiązań

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

Takie zachowanie ma chyba związek z tym, że dla klauzuli IN musi być taki sam typ danych.

http://technet.microsoft.com/en-us/library/ms177682.aspxŁukasz Schabek edytował(a) ten post dnia 03.06.09 o godzinie 14:05
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

Łukasz Schabek:
Takie zachowanie ma chyba związek z tym, że w klauzuli IN musi być taki sam typ danych.

http://technet.microsoft.com/en-us/library/ms177682.aspx

"Any null values returned by subquery or expression that are compared to test_expression using IN or NOT IN return UNKNOWN. Using null values in together with IN or NOT IN can produce unexpected results."

Dzieki, nie wygooglala mi sie ta strona.Bartosz S edytował(a) ten post dnia 03.06.09 o godzinie 14:07
Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

Coalesce(activitycode,'') not in ('PTO','Holiday','SICK','CTO','APPTRAIN')


pozdrawiaMM
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

Marcin Miga:
Coalesce(activitycode,'') not in ('PTO','Holiday','SICK','CTO','APPTRAIN')

Predzej isnull(activitycode,''). Coalesce po prostu zignoruje rekordy z null - nie pojawia sie w wyniku, a powinny. Jak juz pisalem, obejscie tego nie jest problemem, ciekaw bylem jaki mechanizm tu dziala i dlaczego nulle bywaja pomijane w klauzuli IN lub NOT IN (bo czasem sa a czasem nie sa).Bartosz S edytował(a) ten post dnia 03.06.09 o godzinie 21:46

konto usunięte

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

SELECT     t
FROM (SELECT 1 AS t
UNION ALL
SELECT 2 AS Expr1
UNION ALL
SELECT 3 AS Expr1
UNION ALL
SELECT 4 AS Expr1
UNION ALL
SELECT NULL AS Expr1
UNION ALL
SELECT 6 AS Expr1) AS tab
WHERE (t IN (1, 3)) OR
(t IS NULL)


czy magiczna klauzula OR spełni toje oczekiwania? ;)
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

Przemysław R.:
czy magiczna klauzula OR spełni toje oczekiwania? ;)

Nie. Albo ja bardzo nieprecyzyjnie sie wypowiadam, albo nikt nie czyta postow do konca ;)

konto usunięte

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

Co do wyjaśnienia
Załóżmy że mamy 2 tablice :

Tablica1
K1
1
2
3
Tablica2
K1 K2
1 1
2 2
3 NULL
select *
from Tablica1 t1
where t1.K1 not in (select t2.K2 from Tablica2 t2)

Operacja IN daje serię porównań dla 1 wiersza
(1=1 or 1=2 or 1=NULL)= patrząc do tablicy porównan dostaniemy (TRUE or FALSE or UNKNOW)=TRUE NOT(true)=FALSE czyli nie zwróci wiersza

dla 3 wiersza mamy
(3=1 or 3=2 or 3=NULL)=(FALSE or FALSE or UNKNOWN)=UNKNOWN NOT(UNKNOWN)=UNKNOWN a skoro UNKNOWN to nie TRUE to nie zwracamy wiersza
Jezeli sie nie machnelam gdzies to tak to mniej wiecej dziala :)

a tablice znajdziesz np tutaj: http://en.wikipedia.org/wiki/Null_(SQL)Magdalena Młocek edytował(a) ten post dnia 03.06.09 o godzinie 23:15

konto usunięte

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

kolego... NULL to NULL - to nie jest 'nic'. Dla MSSQL to jest 'nie wiem co' - dlatego trzeba bardzo uwazac przy operacjach NOT.. noo wogóle trzeba uważać.

żebyś zrozumiał

a=1 imie=jacek
a=NULL imie=kazek

teoretycznie więc (i praktycznie)
select * from dupa where imie like 'kazek' and a not like '1' - nic nie wyswietli bo null nie wie czy to 1 czy nie :)

dlatego IS NULL ratuje życie
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

Jacek Ołowiak:
kolego... NULL to NULL - to nie jest 'nic'. Dla MSSQL to jest 'nie wiem co' - dlatego trzeba bardzo uwazac przy operacjach NOT.. noo wogóle trzeba uważać.

żebyś zrozumiał

1) Oczywiscie nikomu nie chce sie czytac poprzednich postow. Co z tego ze odpowiedz na pytanie jest juz w czwartej odpowiedzi, kiedy kolejne dwadziescia osob chetnie powtorzy to co jest juz w kazdym poprzednim poscie
2) Nie o to pytalem.
Marcin Pigłowski

Marcin Pigłowski Specjalista ds. baz
danych

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

Bartosz S: dlaczego nulle bywaja pomijane w klauzuli IN lub NOT IN (bo czasem sa a czasem nie sa).

o to chyba pytałeś wydaje mi się że odpowiedź dostałeś od Magdy i Jacka
Jeżeli nie o to Ci chodziło to już chyba wszyscy się pogubili.
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

Marcin Pigłowski:
Bartosz S: dlaczego nulle bywaja pomijane w klauzuli IN lub NOT IN (bo czasem sa a czasem nie sa).

o to chyba pytałeś wydaje mi się że odpowiedź dostałeś od Magdy i Jacka
Jeżeli nie o to Ci chodziło to już chyba wszyscy się pogubili.

Nie pytalem co to jest null. Nikt sie nie pogubil, bo wszyscy odpowiedzieli na pytanie. Ciagle jednak nie wiem, dlaczego null czasami jest jest uwzgleniany jako nie nalezacy do zbioru a czasem nie - ale jestem z tym w stanie zyc :)Bartosz S edytował(a) ten post dnia 10.06.09 o godzinie 17:10

konto usunięte

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

Bartosz S:
Jacek Ołowiak:
kolego... NULL to NULL - to nie jest 'nic'. Dla MSSQL to jest 'nie wiem co' - dlatego trzeba bardzo uwazac przy operacjach NOT.. noo wogóle trzeba uważać.

żebyś zrozumiał

1) Oczywiscie nikomu nie chce sie czytac poprzednich postow. Co z tego ze odpowiedz na pytanie jest juz w czwartej odpowiedzi, kiedy kolejne dwadziescia osob chetnie powtorzy to co jest juz w kazdym poprzednim poscie
2) Nie o to pytalem.
w takim razie chyba Ty nie czytasz dokładnie albo nie rozumiesz swojego problemu i naszych podppowiedzi (aha.. i nikt nie powiela postów, każdy odpisał inne wytłumaczenie tego samego problemu tak aby stalo się to jasne dla wszystkich).
zacznij myśleć bardziej relacyjnie
Monika A.

Monika A. programista

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

Bartku - czy o to chodzi?
http://drsql.spaces.live.com/blog/cns!80677FB08B3162E4...

Pozdrawiam,
Monika
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

Jacek Ołowiak:
w takim razie chyba Ty nie czytasz dokładnie albo nie rozumiesz swojego problemu i naszych podppowiedzi

Pff.
Pytanie dotyczylo logiki operacji na zbiorach i roznego zachowania zapytan NOT IN na SQL Server dla zbiorow z NULL.

Jako spec/DBA/programista SQL servera powinienes znac opcje "set ansi_nulls", bo to ona kontroluje w jaki sposob interpretowane sa nulle w zapytaniach.

Korzystajac z kodu Przemka:


SELECT t
FROM (SELECT 1 AS t
UNION ALL
SELECT 2 AS Expr1
UNION ALL
SELECT 3 AS Expr1
UNION ALL
SELECT 4 AS Expr1
UNION ALL
SELECT NULL AS Expr1
UNION ALL
SELECT 6 AS Expr1) AS tab
WHERE (t not in (1, 3))

t
-----------
2
4
6

(3 row(s) affected)


A teraz to samo z ANSI_NULLS OFF

SET ANSI_NULLS OFF
go

SELECT t
FROM (SELECT 1 AS t
UNION ALL
SELECT 2 AS Expr1
UNION ALL
SELECT 3 AS Expr1
UNION ALL
SELECT 4 AS Expr1
UNION ALL
SELECT NULL AS Expr1
UNION ALL
SELECT 6 AS Expr1) AS tab
WHERE (t not in (1, 3))

t
-----------
2
4
NULL
6

(4 row(s) affected)


Co wreszcie odpowiada na ta czesc pytania, ktora nie byla jeszcze wyjasniona.

Dziekuje Monice za linka pod ktorym lezala odpowiedz i calej reszcie za lopatologiczne wyjasnienie nullowej logiki dzialan na zbiorach :)Bartosz S edytował(a) ten post dnia 11.06.09 o godzinie 10:52
Marcin Pigłowski

Marcin Pigłowski Specjalista ds. baz
danych

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

Magdalena Młocek:
Operacja IN daje serię porównań dla 1 wiersza
(1=1 or 1=2 or 1=NULL)= patrząc do tablicy porównan dostaniemy (TRUE or FALSE or UNKNOW)=TRUE NOT(true)=FALSE czyli nie zwróci wiersza

dla 3 wiersza mamy
(3=1 or 3=2 or 3=NULL)=(FALSE or FALSE or UNKNOWN)=UNKNOWN NOT(UNKNOWN)=UNKNOWN a skoro UNKNOWN to nie TRUE to nie zwracamy wiersza
Jezeli sie nie machnelam gdzies to tak to mniej wiecej dziala :)


Logically, the IN operation does a series of compares. Like for
the first row in parent, where parentId = 1, you get the following
comparison:

(1=1 or 1=1 or 1=2 or 1=NULL) = (TRUE or TRUE or FALSE or UNKNOWN)
= TRUE. NOT(TRUE) = FALSE, so the row where parentId = 1 is
not returned.

Now, when you get to the row where parentId = 3, the following happens:

(3=1 or 3=1 or 3=2 or 3=NULL) = (FALSE or FALSE or FALSE or
UNKNOWN) = UNKNOWN (check the truth tables here if this is
confusing to you) The value here is NOT(UNKNOWN) = UNKNOWN. Since
UNKNOWN is not TRUE, 3 is not returned.


jakoś to dla mnie podobne :) co oznacza ze ta część odpowiedzi już byłaMarcin Pigłowski edytował(a) ten post dnia 11.06.09 o godzinie 09:31
Monika A.

Monika A. programista

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

Marcin Pigłowski:
Magdalena Młocek:
Operacja IN daje serię porównań dla 1 wiersza
(1=1 or 1=2 or 1=NULL)= patrząc do tablicy porównan dostaniemy (TRUE or FALSE or UNKNOW)=TRUE NOT(true)=FALSE czyli nie zwróci wiersza

dla 3 wiersza mamy
(3=1 or 3=2 or 3=NULL)=(FALSE or FALSE or UNKNOWN)=UNKNOWN NOT(UNKNOWN)=UNKNOWN a skoro UNKNOWN to nie TRUE to nie zwracamy wiersza
Jezeli sie nie machnelam gdzies to tak to mniej wiecej dziala :)


Logically, the IN operation does a series of compares. Like for
the first row in parent, where parentId = 1, you get the following
comparison:

(1=1 or 1=1 or 1=2 or 1=NULL) = (TRUE or TRUE or FALSE or UNKNOWN)
= TRUE. NOT(TRUE) = FALSE, so the row where parentId = 1 is
not returned.

Now, when you get to the row where parentId = 3, the following happens:

(3=1 or 3=1 or 3=2 or 3=NULL) = (FALSE or FALSE or FALSE or
UNKNOWN) = UNKNOWN (check the truth tables here if this is
confusing to you) The value here is NOT(UNKNOWN) = UNKNOWN. Since
UNKNOWN is not TRUE, 3 is not returned.


jakoś to dla mnie podobne :) co oznacza ze ta część odpowiedzi już byłaMarcin Pigłowski edytował(a) ten post dnia 11.06.09 o godzinie 09:31

Może Bartek woli po angielsku ;)
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: [MS SQL] Zagadka - czemu select nie zwraca wyniku

Marcin Pigłowski:
jakoś to dla mnie podobne :) co oznacza ze ta część odpowiedzi już była

Ale komentarze byly ciekawe - ktos zwrocil uwage na ANSI NULLS i kilka innych interesujacych zachowan MS SQL :)
Monika M.:
Może Bartek woli po angielsku ;)

Bez roznicy :)Bartosz S edytował(a) ten post dnia 12.06.09 o godzinie 10:35

Następna dyskusja:

[SQL] Zapytanie SELECT




Wyślij zaproszenie do