web-dev-qa-db-fra.com

La chaîne vide Oracle est convertie en null

Lors d'une insertion, une chaîne vide est convertie en null:

insert into test (f) values ('');

Maintenant, il y a une ligne avec f contenant un null.

Mais, lorsque je recherche la table, je ne peux pas utiliser '':

select * from test where f='';
no rows selected

Je peux utiliser null:

select * from test where f is null;
____F_
NULL

Donc ... il semble qu'Oracle ait décidé que les chaînes vides ne peuvent pas être utilisées pour l'insertion, mais elles restent des chaînes vides lors des requêtes. Où est la documentation sur quand une chaîne vide devient nulle et quand elle reste une chaîne vide?

7
kainaw

Cela dit tout:

select NVL('','it is null') as value
from dual;

SQL Fiddle

2 choses:

1) '' est converti en NULL lors de l'insertion. C'est un Oracle VARCHAR2 chose.

2) select * from test where f=''; essaie de faire select * from test where f=NULL, qui n'est pas défini, et ne renverra rien car NULL n'aime pas l'opérateur d'égalité. Vous devez utiliser IS NULL ou IS NOT NULL.

J'ajouterai que le type de données CHAR se comporte différemment car il est rembourré.

8
Philᵀᴹ

Oracle traite '' et NULL de la même manière. Lors de l'insertion de '', il n'y a pas de conversion de '' en NULL, simplement une interprétation de '' en tant que NULL de la même manière que le mot NULL est interprété comme NULL ou rtrim ('a ',' a ') est interprété comme NULL.

Voici une démonstration utilisant le tableau et l'insert suivants:

drop table t1;
create table t1 (c1 varchar2(10));
insert into t1 (c1) values ('');

L'insert ci-dessus a inséré une valeur NULL pour c1. Vous pouvez sélectionner cette ligne comme suit:

SELECT c1 FROM t1;

Lorsque vous ajoutez une clause WHERE pour comparer l'égalité et que l'une des valeurs comparées est NULL, le résultat sera toujours inconnu. Inconnu sera évalué à faux, sauf que d'autres opérations sur une valeur inconnue produisent des valeurs inconnues. Tous les éléments suivants ne renvoient aucune ligne car les clauses WHERE contiennent des conditions qui ne seront jamais vraies quelles que soient les données.

SELECT c1 FROM t1 WHERE c1 = '';
SELECT c1 FROM t1 WHERE c1 = NULL;
SELECT c1 FROM t1 WHERE '' = '';
SELECT c1 FROM t1 WHERE NULL = NULL;

Oracle fournit une syntaxe spéciale pour récupérer des lignes avec une colonne particulière ayant des valeurs nulles - IS NULL.

SELECT c1 FROM t1 WHERE c1 IS NULL;

Il existe quelques conditions dans lesquelles Oracle compare les valeurs NULL en les traitant comme égales aux autres valeurs NULL, comme dans les instructions DECODE et dans les clés composées.

Plus d'informations peuvent être trouvées dans le SQL Language Reference .

6
Leigh Riffel