2009-04-29 6 views
7

En Mysql hay un operador de comparación que es una caja fuerte nula: < =>. Yo uso este en mi programa Java al crear declaraciones preparadas de esta manera:Cómo escribir una caja fuerte nula compare "<=>" en SQL puro?

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

Ahora me gustaría cambiar a la base de datos de H2. ¿Cómo escribo el operador < => en SQL puro (utilizando, por ejemplo, IS NULL y IS NOT NULL)? Me gustaría utilizar la operación stmt.setString solo una vez. Está bien escribir el nombre de la columna varias veces.

La pregunta relacionada es Get null == null in SQL. Pero esa respuesta requiere que el valor de búsqueda se escriba 2 veces (es decir: 2 signos de interrogación en mi PreparedStatement) !?

Referencia: http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_equal-to

+0

No estoy seguro de que entiendo completamente lo que quiere hacer. ¿Desea que la declaración pueda devolver filas cuando coincide con ROUTER_ADDRESS en el parámetro no nulo que pasa, y para devolver las filas donde ROUTER_ADDRESS es nulo cuando pasa nulo? –

+0

Sí, eso es exactamente! My getSomeValue() puede devolver valores nulos y no nulos. Cuando devuelve nulo, quiero todas las filas donde ROUTER_ADDRESS es nulo. –

+0

En SQL puro (= estándar) que sería 'a es distinto de b' –

Respuesta

9

cuestión relacionada es nula Obtener == null en SQL. Pero esa respuesta requiere que el valor de búsqueda se escriba 2 veces (es decir: 2 signos de interrogación en mi PreparedStatement) !?

El segundo clasificado y respuestas posteriores dan un método para hacer esto sin enlazar el valor de búsqueda dos veces:

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

Tenga en cuenta que esto requiere un valor ficticio que nunca puede ser el valor de columna válido (que es " fuera de banda"); Estoy usando la cadena vacía. Si usted no tiene tal valor, tendrá que aguantar a enlazar el valor de dos veces:

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

En SQL, NULL no es igual a sí mismo. Por lo tanto, puede:

1 - Reemplazar con un valor ficticio y compara los, como en:

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

o

2 - Sustituir con una prueba lógica más elaborada, como en:

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 <> ? 
    ) 
0

Si desea ROUTERS donde ROUTER_ADDRESS es nulo, ¿cuándo? es nulo, posiblemente esto podría funcionar:

SELECT * 
FROM ROUTERS 
WHERE ROUTER_ADDRESS = (case when ROUTER_ADDRESS is null and ? is null then null 
          else ? end) 
6

la hipótesis nula de fallos operadores de igualdad estándar en SQL son IS DISTINCT FROM y IS NOT DISTINCT FROM.

+2

H2 ahora también admite esta sintaxis. Y admite la sintaxis (más corta pero no estándar) 'x IS y' y' x IS NOT y'. –

Cuestiones relacionadas