validar uso texto operador numero ejemplos convertir concatenar campo sql sql-server oracle

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.