texto - uso de like en sql
Compatible con SQL para probar cadenas no vacĂas y no nulas (4)
Creo que la clave aquí es diferenciar entre el caso cuando la cadena vacía es equivalente a NULL y cuando no lo es:
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 el primer caso es verdadero, la cadena vacía no es lo mismo que nula, y tenemos que probar que la cadena no sea nula y que la cadena no sea la cadena vacía. De lo contrario, nuestra tarea es más fácil porque la cadena vacía y la nula evalúan la misma.
Quiero tener SQL compatible tanto para la base de datos Oracle como para el servidor Microsoft SQL.
Quiero una expresión SQL compatible que devuelva true para las cadenas no nulas y no vacías.
Si uso:
column <> ''''
funcionará en Microsoft SQL Server pero no en la base de datos Oracle (ya que '''' es nulo para Oracle)
Si uso:
len(column) > 0
funcionará en Microsoft SQL Server pero no en la base de datos Oracle (ya que usa length ())
Qué tal si
CASE WHEN column = '''' THEN NULL ELSE column END IS NOT NULL
Un intento de acortar la respuesta de @ DCookie. Me gusta su prueba ( '''' = '''' )
.
CASE WHEN ( '''' = '''' ) THEN ( column <> '''' )
ELSE ( column = column )
END
Lamentablemente, lo anterior no funcionará. El siguiente funciona en SQL-Server. No puedo probar en Oracle ahora:
CASE WHEN '''' = '''' THEN CASE WHEN column <> '''' THEN 1 ELSE NULL END
ELSE CASE WHEN column = column THEN 1 ELSE NULL END
END
que se puede escribir también como:
( '''' = '''' AND column <> '''' )
OR ( '''' IS NULL AND column = column )
NULLIF
está disponible tanto en Oracle ( doc ) como en SQL Server ( doc ). Esta expresión debería funcionar:
NULLIF(column, '''') IS NOT NULL
En ambos servidores, si la column
es NULL
, la salida de NULLIF
solo pasará el valor NULL
. En SQL Server, '''' = ''''
, por lo que la salida de NULLIF
será NULL
. En Oracle, ''''
ya es NULL
, por lo que se pasa.
Esta es mi prueba en SQL Server 2008 R2 Express:
WITH SampleData AS
(SELECT 1 AS col1, CAST(NULL AS varchar(10)) AS col2
UNION ALL
SELECT 2, ''''
UNION ALL
SELECT 3, ''hello'')
SELECT *
FROM SampleData
WHERE NULLIF(col2, '''') IS NOT NULL;
Y este es mi caso de prueba en 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;
Ambos devuelven 3
como se esperaba.