Cómo usar una cadena NULL o vacía en SQL


129

Me gustaría saber cómo usar NULL y una cadena vacía al mismo tiempo en una WHEREcláusula en SQL Server. Necesito encontrar registros que tengan valores nulos o una cadena vacía. Gracias.


55
Hay una palabra clave OR en SQL.
Robert Harvey

13
Esta pregunta no muestra ningún esfuerzo de investigación. Es importante hacer tu tarea . Díganos qué encontró y por qué no satisfizo sus necesidades. Esto demuestra que te has tomado el tiempo para intentar ayudarte a ti mismo, nos salva de reiterar respuestas obvias y, sobre todo, te ayuda a obtener una respuesta más específica y relevante. FAQ .
Kermit

1
posible duplicado de Cómo seleccionar datos de la tabla MySQL donde una columna es NULL (esta fue una pregunta de MySQL, pero es básicamente la misma respuesta para t-sql)
Michael Berkowski

Respuestas:



27

Simplemente puedes hacer esto:

SELECT *
FROM   yourTable
WHERE  yourColumn IS NULL OR yourColumn = ''

25

Si lo necesita en la sección SELECCIONAR puede usarlo así.

    SELECT  ct.ID, 
            ISNULL(NULLIF(ct.LaunchDate, ''), null) [LaunchDate]
    FROM    [dbo].[CustomerTable] ct

puede reemplazar el nullcon su valor de sustitución.


1
La NVL de Oracle (var1, 'valor') se encargará del reemplazo de la cadena vacía ''. Isnull de T-SQL (var1, 'valor') no lo hace.
Jenna Leaf

15
SELECT *
FROM   TableName
WHERE  columnNAme IS NULL OR 
       LTRIM(RTRIM(columnName)) = ''

2
SELECCIONAR * DESDE TableName DONDE columnNAme ES NULO O RTRIM (columnName) = ''
Xavier John

2
Como señala Xavier, no hay necesidad de hacer AMBOS ltrimy rtrimsi el objetivo es simplemente comparar con una cadena vacía. MOTIVO: si SOLO hay un espacio en blanco, un solo recorte lo eliminará todo. Por ejemplo, no le importa si la comparación falla porque lo que queda es "abc" o "abc".
ToolmakerSteve

8

Para buscar filas donde está col NULL, cadena vacía o espacios en blanco (espacios, pestañas):

SELECT *
FROM table
WHERE ISNULL(LTRIM(RTRIM(col)),'')=''

Para buscar filas donde está col NOT NULL, cadena vacía o espacios en blanco (espacios, pestañas):

SELECT *
FROM table
WHERE ISNULL(LTRIM(RTRIM(col)),'')<>''

7

Algunos sargable métodos ...

SELECT *
FROM #T
WHERE SomeCol = '' OR SomeCol IS NULL;

SELECT *
FROM #T
WHERE SomeCol = '' 
UNION ALL
SELECT *
FROM #T
WHERE  SomeCol IS NULL;

SELECT *
FROM #T
WHERE EXISTS ((SELECT NULL UNION SELECT '') INTERSECT SELECT SomeCol);

Y algunos no sargable ...

SELECT *
FROM #T
WHERE IIF(SomeCol <> '',0,1) = 1;

SELECT *
FROM #T
WHERE NULLIF(SomeCol,'') IS NULL;

SELECT *
FROM #T
WHERE ISNULL(SomeCol,'') = '';

3

Esto es feo MSSQL:

CASE WHEN LTRIM(RTRIM(ISNULL([Address1], ''))) <> '' THEN [Address2] ELSE '' END

3

mi mejor solución

 WHERE  
 COALESCE(char_length(fieldValue), 0) = 0

COALESCE devuelve el primer expr no nulo en la lista de expresiones ().

si fieldValue es una cadena nula o vacía, entonces: devolveremos el segundo elemento y luego 0.

entonces 0 es igual a 0, entonces este fieldValue es una cadena nula o vacía.

en python por ejemplo:

def coalesce(fieldValue):
    if fieldValue in (null,''):
        return 0

buena suerte


2

compruebe nulo con IS NULL y cadena vacía con LEN (RTRIM (LTRIM (Column))) = 0 in

SELECT *
FROM AppInfra.Person
WHERE   LEN(RTRIM(LTRIM(NationalCode))) = 0 OR  NationalCode IS NULL


1
SELECT *
FROM   Table
WHERE  column like '' or column IS NULL OR LEN(column) = 0

1

Puede usar la isnullfunción para obtener nullvalores vacíos y de un campo de texto:

SELECT * FROM myTable
WHERE isnull(my_nullable_text_field,'') = ''

La función isnull literalmente solo verifica si el valor es nulo. No funcionará si la cadena está vacía ("").
Max Pringle

@Max Pringle. No digo de otra manera. También el código proporcionado aborda la solicitud de preguntas. No estoy seguro de tu contribución. Sugerir una edición en lugar de hacer downvoting.
Alberto De Caro

Tomaremos tu consejo. Puse una edición sugerida ahora. Esta cláusula where solo obtiene los valores nulos, no los valores de cadena vacíos. Un nullif podría usarse para obtener los valores vacíos.
Max Pringle

1
--setup
IF OBJECT_ID('tempdb..#T') IS NOT NULL DROP TABLE #T;
CREATE TABLE #T(ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, NAME VARCHAR(10))
INSERT INTO #T (Name) VALUES('JOHN'),(''),(NULL);
SELECT * FROM #T
 1  JOHN
 2  -- is empty string
 3  NULL

Puede examinar ''como NULLmediante la conversión a NULLutilizarNULLIF

--here you set '' to null
UPDATE #T SET NAME = NULLIF(NAME,'')
SELECT * FROM #T 
 1  JOHN
 2  NULL
 3  NULL

o se puede examinar NULLcomo ''el usoSELECT ISNULL(NULL,'')

-- here you set NULL to ''
UPDATE #T SET NAME = ISNULL(NULL,'') WHERE NAME IS NULL
SELECT * FROM #T
1   JOHN
2   -- is empty string
3   -- is empty string

--clean up
DROP TABLE #T

1

En sproc, puede usar la siguiente condición:

DECLARE @USER_ID VARCAHR(15)=NULL --THIS VALUE IS NULL OR EMPTY DON'T MATTER
IF(COALESCE(@USER_ID,'')='')
PRINT 'HUSSAM'

1

por esta función:

ALTER FUNCTION [dbo].[isnull](@input nvarchar(50),@ret int = 0)
RETURNS int
AS
BEGIN

    return (case when @input='' then @ret when @input is null then @ret else @input end)

END

y usa esto:

dbo.isnull (valor, 0)


1
SELECT * FROM DBO.AGENDA
WHERE 
  --IF @DT_START IS NULL OR EMPTY
  ( ISNULL( @DT_START,'' ) = '' AND DT_START IS NOT NULL ) -- GET ALL DATE
  OR --ELSE
  ( DT_START >= @DT_START ) --FILTER

-- MORE FILTER

SELECT * FROM DBO.AGENDA
WHERE 
  ( ( ISNULL( @DT_START,'' ) = '' AND DT_START IS NOT NULL ) OR ( DT_START >= @DT_START ) ) 
  AND
  DT_END < GETDATE()
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.