Der er ingen forskel.
Alle større motorer (det vil sige MySQL
, SQL Server
, Oracle
og PostgreSQL
) vil flette disse prædikater på parsing-stadiet og lave identiske planer ud fra dem.
Håndtering af disse forhold er mere kompleks end blot at anvende operatører i en eller anden rækkefølge.
For eksempel i Oracle
, en IS NOT NULL
(eller NOT IS NULL
) betingelse indebærer en mulighed for at bruge et indeks, så en forespørgsel som denne:
SELECT column
FROM mytable
WHERE column IS NOT NULL
vil højst sandsynligt blive udført med en index fast full scan
, uden yderligere kontrol foretaget i runtime (siden NULL
værdier kommer bare ikke ind i indekset, så det nytter ikke at tjekke dem).
Selvom hver post skulle kontrolleres, vil kontrolrækkefølgen blive defineret af optimeringsværktøjet (og ikke af den rækkefølge, prædikaterne og operatorerne vises i WHERE
) klausul).
For eksempel er her en plan for en Oracle
forespørgsel:
SQL> EXPLAIN PLAN FOR
2
2 SELECT *
3 FROM t_test
4 WHERE NOT column IS NULL
5 /
Explained
SQL> SELECT *
2 FROM TABLE(DBMS_XPLAN.display())
3 /
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 958699830
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 30 | 1260 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T_TEST | 30 | 1260 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("COLUMN" IS NOT NULL)
Som du kan se, er filter
blev internt oversat til en IS NOT NULL
(hvilket Oracle
sammen med de fleste kommentatorer synes at være en mere passende form)
Opdatering:
Som Jonathan Leffler påpegede, er disse forskelle ved evaluering af tupler (i modsætning til enkelte kolonner).
En tuple bestående af blandet NULL
og ikke-NULL
værdier er hverken en NULL
heller ikke en NOT NULL
.
I PostgreSQL
(som understøtter dette prædikat mod tupler), begge disse udtryk:
SELECT (1, NULL) IS NULL
SELECT (1, NULL) IS NOT NULL
evaluer til falsk.