А я брахаць ня ўмею, дык і завыў - February 6th, 2009
[Recent Entries][Archive][Friends][User Info]
09:55 am
![[User Picture]](http://lj.rossia.org/userpic/171027/2283) [Link] |
Трохзначная лёгіка наносіць удар у адказ. / Three-valued logic strikes back Аналітыкі адлавілі багафічу. IN працуе як звычайнае параўнаньне з кожным значэньнем са сьпіса ( x IN(a,b,c) == (x=a OR x=b OR x=c) ), таму калі ў сьпісе значэньняў у IN трапляецца NULL, x=NULL неазначана і рэзультат нечакана пусты. Лечыцца дадаткам IS NOT NULL у падзапыце.
CREATE TABLE #temp(i int, flag bit NOT NULL)
INSERT INTO #temp VALUES(1, 1)
INSERT INTO #temp VALUES(2, 0)
INSERT INTO #temp VALUES(NULL, 0)
--returns 2 and NULL
SELECT i FROM #temp WHERE flag=0
--returns 1
SELECT i FROM #temp WHERE flag=1
--you would expect this to return 1, just like the query before, but it returns nothing!
SELECT i FROM #temp WHERE i not in (SELECT i FROM #temp WHERE flag=0)
--this corrected query returns 1, as it should
SELECT i FROM #temp WHERE i not in (SELECT i FROM #temp WHERE flag=0 AND i IS NOT NULL)
Current Music: Лаэртский - Карлица Tags: code, sql
|
|