SELECT id FROM customers WHERE type IS NOT Null;
En contra:
SELECT id FROM customers WHERE NOT type IS NULL;
Los datos que devolverá cualquiera de los anteriores serán exactamente los mismos.
¿Cuál es la diferencia y por qué sería preferible uno de ellos?
Editar:
Me parece que podría haber una diferencia en lo que respecta al rendimiento. ¿Alguien quiere dar más detalles sobre esto?
- Icode4food
SourceNo hay diferencia.
Me parece que podría haber una diferencia en lo que respecta al rendimiento. ¿Alguien quiere dar más detalles sobre esto?
Todos los motores principales (es decir, MySQL
, SQL Server
, Oracle
y
El manejo de estas condiciones es más complejo que la mera aplicación de operadores en uno u otro orden.
Por ejemplo, en PostgreSQL
, una condición Oracle
(o IS NOT NULL
) implica la posibilidad de usar un índice , por lo que una consulta como esta:
NOT IS NULL
probablemente se ejecutará con un SELECT column
FROM mytable
WHERE column IS NOT NULL
, sin comprobaciones adicionales realizadas en tiempo de ejecución (ya que los valores de index fast full scan
simplemente no llegarán al index, por lo que no sirve de nada revisarlos).
Incluso si fuera necesario comprobar cada registro, el optimizador definirá el orden de las comprobaciones (y no el orden en que aparecen los predicados y operadores en la cláusula NULL
).< /p>
Por ejemplo, aquí hay un plan para una consulta WHERE
:
Oracle
Como puede ver, el 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)
se tradujo internamente a un filter
(que IS NOT NULL
junto con la mayoría de los comentaristas parece creer que es una forma más apropiada)
Actualización:
Como señaló Jonathan Leffler, esta es la diferencia al evaluar tuplas (a diferencia de las columnas individuales).
Una tupla que consta de valores mixtos Oracle
y no NULL
no es ni NULL
ni
En NULL
(que admite este predicado contra tuplas), ambas expresiones:
NOT NULL
evaluar a falso.