web-dev-qa-db-fra.com

Compatible SQL pour tester des chaînes non nulles et non vides

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 ())

22
Eduardo

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.

39
Cheran Shunmugavel

Que diriez-vous

CASE WHEN column = '' THEN NULL ELSE column END IS NOT NULL
8
Gary Myers

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.

1
DCookie

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 ) 
0
ypercubeᵀᴹ