2010-11-05 5 views
41

Me gustaría escribir una instrucción SELECT que use solo una prueba para devolver columnas sin valor (nulo, vacío o todos los espacios).¿Cómo verificar los valores null/empty/whitespace con una sola prueba?

pensé que esto funcionaría:

SELECT column_name from table_name WHERE column_name NOT LIKE '%_%'; 

Pero esto no funciona para valores NULL.

Por supuesto que puedo agregar

OR column_name IS NULL 

y que va a trabajar, pero me gustaría una forma que utiliza una sola prueba.

+0

Estoy usando Oracle 10g. –

+1

Relacionados: http://stackoverflow.com/questions/4042496/how-should-i-deal-with-null-parameters-in-a-pl-sql-stored-procedure-when-i-want-t/4042572 # 4042572 –

+0

¿No es deseable tener múltiples pruebas? es decir, más granularidad = mejor retroalimentación para los usuarios acerca de cómo corregir los datos. – onedaywhen

Respuesta

54

Funcionalmente, usted debería ser capaz de utilizar

SELECT column_name 
    FROM table_name 
WHERE TRIM(column_name) IS NULL 

El problema no es que no se utilizaría un índice en COLUMN_NAME. Debería tener un índice basado en función en TRIM (column_name) si es una condición selectiva.

+17

Nota para usuarios de T-SQL: no hay TRIM, necesitará LTRIM o RTRIM. – demoncodemonkey

+2

Como ** SQL Server 2017 ** hay una función TRIM. [Fuente] (https://docs.microsoft.com/en-us/sql/t-sql/functions/trim-transact-sql) – EhMann365

+0

@ EhMann365 esta pregunta es sobre Oracle, no el servidor Sql. –

11
SELECT column_name from table_name 
WHERE RTRIM(ISNULL(column_name, '')) LIKE '' 

ISNULL(column_name, '') volverá '' si COLUMN_NAME es NULL, en caso contrario devolverá COLUMN_NAME.

ACTUALIZACIÓN

En Oracle, puede utilizar NVL para lograr los mismos resultados.

SELECT column_name from table_name 
WHERE RTRIM(NVL(column_name, '')) LIKE '' 
+3

realmente esto todavía no funciona en Oracle, Oracle trata cadenas vacías como NULL por lo que no puede tener una cláusula de "no me gusta" ya que compara con un valor nulo – Harrison

+0

¿No querría LIKE en lugar de NO? ME GUSTA '' ? –

+0

Sí, lo siento, leí mal la pregunta original porque quería todo lo que tiene un valor. Pero como señaló Tanging, no parece que esto funcione en Oracle. – GendoIkari

-1

Como en Oracle puede utilizar la función NVL en MySQL se puede utilizar IFNULL (columnaName, nuevoValor) hasta conseguir el resultado deseado como en este ejemplo

SELECT column_name from table_name WHERE IFNULL(column_name,'') NOT LIKE '%_%'; 
-1

Lo que yo uso para IsNotNullOrEmptyOrWhiteSpace en T-SQL es:

SELECT [column_name] FROM [table_name] 
WHERE LEN(RTRIM(ISNULL([column_name], ''))) > 0 
-2

puede utilizar

SELECT [column_name] 
FROM [table_name] 
WHERE [column_name] LIKE '% %' 
OR [column_name] IS NULL 
0

La función NULLIF convertirá cualquier columna valor con solo espacios en blanco en un valor NULO. Funciona para T-SQL y SQL Server 2008 & arriba.

SELECT [column_name] 
FROM [table_name] 
WHERE NULLIF([column_name], '') IS NULL 
+1

Una buena respuesta contendría una explicación del código y por qué fue escrito de esta manera. Te recomiendo que actualices tu respuesta :-) – Qirel

+0

Has actualizado la respuesta – MerrickPlainview

+0

¿Cuál es el punto de esto? Sería más eficiente simplemente establecerlo en [column_name] LIKE '' – SILENT

3

Mientras que el registro null or Empty valor para una columna, he notado que hay algunas preocupaciones de apoyo en diversas bases de datos.

cada base de datos no admite TRIM método.

A continuación se muestra la matriz para comprender los métodos admitidos por diferentes bases de datos.

La función TRIM en SQL se usa para eliminar prefijos o sufijos especificados de una cadena. El patrón más común que se elimina es el espacio en blanco.Esta función se denomina de forma diferente en diferentes bases de datos:

  • MySQL:TRIM(), RTRIM(), LTRIM()
  • Oracle:RTRIM(), LTRIM()
  • SQL Server:TRIM(), RTRIM(), LTRIM()

cómo comprobar vacío/Null/Whitespace: -

A continuación se presentan dos maneras diferentes de acuerdo a diferentes Databases-

La sintaxis de estas funciones de ajuste son:

  1. uso de Trim a check-

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. El uso de LTRIM & RTRIM a check-

    SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL

Por encima de ambas formas proporcionan mismo resultado sólo tiene que utilizar la base de su apoyo base de datos. Simplemente devuelve la tabla UserDetailsFirstName de si tiene un vacío LastName

Con la esperanza de que esto ayudará a que otros también :)

+0

WITH t as (seleccionar '' c union all select '' c union all seleccionar NULL) SELECT * FROM t WHERE LTRIM (RTRIM (c)) IS NULL ; no devolvió 3 registros en el servidor SQL – Waqar

+1

¿Por qué se necesitarían tanto L & RTRIM? ¿No bastaría solo con una de las funciones para verificar si la columna está vacía? – SILENT

0

phpMyAdmin Esta consulta está regresando esas filas, que no son nulos o vacíos o sólo espacios en blanco :

SELECT * FROM `table_name` WHERE NOT ((`column_name` IS NULL) OR (TRIM(`column_name`) LIKE '')) 

si desea seleccionar filas que son nulas/vacías/solo espacios en blanco, simplemente elimine NOT.

Cuestiones relacionadas