Je veux avoir un SQL compatible pour la base de données Oracle et le serveur Microsoft SQL.
Je veux une expression SQL compatible qui renvoie true pour les chaînes non null et non vides.
Si j'utilise:
column <> ''
cela fonctionnera sur le serveur Microsoft SQL mais pas sur la base de données Oracle (car '' est nul pour Oracle)
Si j'utilise:
len(column) > 0
cela fonctionnera sur le serveur Microsoft SQL mais pas sur la base de données Oracle (car il utilise length ())
NULLIF
est disponible à la fois sur Oracle ( doc ) et SQL Server ( doc ). Cette expression devrait fonctionner:
NULLIF(column, '') IS NOT NULL
Sur les deux serveurs, si column
est NULL
, la sortie de NULLIF
transmettra simplement la valeur NULL
. Sur SQL Server, '' = ''
, le résultat de NULLIF
sera donc NULL
. Sur Oracle, ''
est déjà NULL
, il est donc transmis.
Voici mon test sur SQL Server 2008 R2 Express:
WITH SampleData AS
(SELECT 1 AS col1, NULL AS col2
UNION ALL
SELECT 2, ''
UNION ALL
SELECT 3, 'hello')
SELECT *
FROM SampleData
WHERE NULLIF(col2, '') IS NOT NULL;
Et voici mon test sur Oracle 10g XE:
WITH SampleData AS
(SELECT 1 AS col1, NULL AS col2 FROM DUAL
UNION ALL
SELECT 2, '' FROM DUAL
UNION ALL
SELECT 3, 'hello' FROM DUAL)
SELECT *
FROM SampleData
WHERE NULLIF(col2, '') IS NOT NULL;
Les deux renvoient 3
comme prévu.
Que diriez-vous
CASE WHEN column = '' THEN NULL ELSE column END IS NOT NULL
Je pense que la clé ici est de différencier le cas où la chaîne vide est équivalente à NULL et quand ce n'est pas le cas:
WHERE CASE WHEN '' = '' THEN -- e.g., SQL Server this is true
CASE WHEN col <> '' AND col IS NOT NULL THEN 'Y'
ELSE 'N'
END
WHEN COALESCE(col,NULL) IS NOT NULL THEN 'Y' -- Not SS, e.g., Oracle
ELSE 'N'
END = 'Y';
Si le premier cas est vrai, la chaîne vide n'est pas la même chose que null et nous devons vérifier que la chaîne n'est pas nulle et que la chaîne n'est pas la chaîne vide. Sinon, notre tâche est plus facile car la chaîne vide et la valeur NULL l’évaluent.
Essayez de raccourcir la réponse de @ DCookie. J'aime son test ( '' = '' )
.
CASE WHEN ( '' = '' ) THEN ( column <> '' )
ELSE ( column = column )
END
Malheureusement, ce qui précède ne fonctionnera pas. La prochaine fonctionne dans SQL-Server. Je ne peux pas tester dans Oracle maintenant:
CASE WHEN '' = '' THEN CASE WHEN column <> '' THEN 1 ELSE NULL END
ELSE CASE WHEN column = column THEN 1 ELSE NULL END
END
qui peut être écrit aussi comme:
( '' = '' AND column <> '' )
OR ( '' IS NULL AND column = column )