Question

Dans Mysql, un opérateur de comparaison est un coffre-fort nul: < = > ;. J'utilise ceci dans mon programme Java lors de la création d'instructions préparées comme ceci:

String routerAddress = getSomeValue();
String sql = "SELECT * FROM ROUTERS WHERE ROUTER_ADDRESS <=> ? ";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, routerAddress);

J'aimerais maintenant passer à la base de données H2. Comment puis-je écrire le < = > opérateur en SQL pur (en utilisant par exemple IS NULL et IS NOT NULL)? Je souhaite utiliser l'opération stmt.setString uniquement une fois . Vous pouvez écrire plusieurs fois le nom de la colonne.

La question connexe est Obtenir null == null en SQL . Mais cette réponse nécessite que la valeur de recherche soit écrite 2 fois (c’est-à-dire 2 points d’interrogation dans mon PreparedStatement)!?

Référence: http://dev.mysql.com/ doc / refman / 5.0 / fr / comparaison-operators.html # opérateur_équivalent-à

Était-ce utile?

La solution

  

La question associée est Get null == null en SQL. Mais cette réponse nécessite que la valeur de recherche soit écrite 2 fois (c’est-à-dire 2 points d’interrogation dans mon PreparedStatement)!?

Les réponses classées au deuxième rang et les suivantes donnent une méthode pour ce faire sans lier deux fois la valeur de recherche:

SELECT * FROM ROUTERS 
WHERE coalesce(ROUTER_ADDRESS, '') = coalesce( ?, '');

Notez que cela nécessite une valeur fictive qui ne peut jamais être une valeur de colonne valide (c'est "hors bande"); J'utilise la chaîne vide. Si vous n'avez pas cette valeur, vous devrez la relier deux fois:

SELECT * FROM ROUTERS 
WHERE ROUTER_ADDRESS = ? or (ROUTER_ADDRESS is null and ? is null);

Autres conseils

Les opérateurs d'égalité NULL-Safe standard dans SQL sont IS DISTINCT FROM et N'EST PAS DISTINCT DE .

En SQL, NULL n'est pas égal à lui-même. Donc, vous pouvez soit:

1 - Remplacez-la par une valeur factice et comparez-la, comme dans:

SELECT * FROM ROUTERS WHERE ISNULL(ROUTER_ADDRESS,'xxx') <=> ISNULL(?,'xxx')

ou

2 - Remplacez-le par un test logique plus élaboré, comme dans:

SELECT *
FROM ROUTERS 
WHERE (
       (ROUTER_ADDRESS IS NULL AND ? IS NOT NULL)
       OR
       (ROUTER_ADDRESS IS NOT NULL AND ? IS NULL)
       OR
       (ROUTER_ADDRESS IS NOT NULL AND ? IS NOT NULL AND ROUTER_ADDRESS <> ?
      )

Si vous voulez des ROUTERS où ROUTER_ADDRESS est nul quand? est nul alors cela pourrait fonctionner:

SELECT * 
FROM ROUTERS 
WHERE ROUTER_ADDRESS = (case when ROUTER_ADDRESS is null and ? is null then null 
                             else ? end)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top