¿Cómo verifico si una columna de texto de SQL Server está vacía?


183

Estoy usando SQL Server 2005. Tengo una tabla con una columna de texto y tengo muchas filas en la tabla donde el valor de esta columna no es nulo, pero está vacío. Intentar comparar con '' produce esta respuesta:

Los tipos de datos text y varchar son incompatibles en el operador no igual a.

¿Existe una función especial para determinar si el valor de una columna de texto no es nulo sino vacío?


1
Si fuera posible, convertiría el tipo de datos a varchar (max), el texto ha quedado en desuso; lo mejor es comenzar a hacer los cambios ahora si está tocando la tabla. Consulte con su dba, por supuesto. Pero cuanto más se pueden convertir las cosas antes de que se deban convertir, mejor es mi pensamiento. Dependerá de la cantidad de código que tenga usando cosas como contener y escribir texto, que se dividirá en cuanto a si debe hacer esto ahora, pero lo menciono, por lo que sabe que esto tendrá que cambiarse eventualmente.
HLGEM

Respuestas:


304
where datalength(mytextfield)=0

2
Esta no era la pregunta real, sino solo un comentario para las personas que solo leen el título, no olviden agregar OR mytextfield IS NULLcuándo puede ser su columnaNULL
Daan

2
mytextfield IS NULL *OR*:-)
prohibición de geoingeniería

3
@ ban-geoingeniería SQL Server T-SQL no respeta las técnicas de evaluación de cortocircuito, por lo que ordenar aquí no afecta el resultado.
Conrad el

47
ISNULL(
case textcolum1
    WHEN '' THEN NULL
    ELSE textcolum1
END 
,textcolum2) textcolum1

La consulta anterior en realidad manejará la naturaleza nula y vacía de una columna de texto y, en consecuencia, asignará el valor en función de la condición. Vota por la respuesta ya que esto es lo que estaba buscando. Gracias
user_v

28

En realidad, solo tienes que usar el operador LIKE.

SELECT * FROM mytable WHERE mytextfield LIKE ''

+1 Prefiero esta respuesta sobre las otras aquí porque no se basa en la sobrecarga adicional de llamar a funciones SQL como DataLength (), IsNull () o Cast (). Tal vez el plan de consulta generado es el mismo (no verifiqué); Todavía encuentro que este es un enfoque mucho más limpio.
MikeTeeVee

5

Para obtener solo valores vacíos (y no valores nulos):

SELECT * FROM myTable WHERE myColumn = ''

Para obtener valores nulos y vacíos:

SELECT * FROM myTable WHERE myColumn IS NULL OR myColumn = ''

Para obtener solo valores nulos:

SELECT * FROM myTable WHERE myColumn IS NULL

Para obtener valores distintos de nulo y vacío:

SELECT * FROM myTable WHERE myColumn <> ''


Y recuerde usar frases LIKE solo cuando sea necesario porque degradarán el rendimiento en comparación con otros tipos de búsquedas.


No quiere decir myColumn IS NOT NULL AND my column = '';?
bcsb1001

2

Use el operador IS NULL:

Select * from tb_Employee where ename is null

1
atoumey afirma en la pregunta que "el valor de esta columna no es nulo, pero está vacío", por lo tanto ISNULL () no funcionaría :)
GazB

2
SELECT * FROM TABLE
WHERE ISNULL(FIELD, '')=''

1
votó, pero ... donde ISNULL (TRIM (Field), '') = '' es aún mejor ;-), si siente que "" es una cadena vacía incluso con espacios en el interior
Kirsten

Para MySQL la sintaxis correcta es:SQL SELECT * FROM TABLE WHERE IFNULL(FIELD, '')=''
Cláudio Silva

1

Sé que esta publicación es antigua, pero me pareció útil.

No resolvió mi problema de devolver el registro con un campo de texto no vacío, así que pensé en agregar mi solución.

Esta es la cláusula where que funcionó para mí.

WHERE xyz LIKE CAST('% %' as text)



0

¿Son nulos y una cadena vacía equivalente? Si lo son, incluiría la lógica en mi aplicación (¿o tal vez un disparador si la aplicación está "lista para usar"?) Para forzar que el campo sea nulo o '', pero no el otro. Si seleccionó '', también podría establecer la columna como NO NULL. Solo una cuestión de limpieza de datos.


0

Quería que se mostrara un texto predefinido ("No hay laboratorios disponibles") si el valor era nulo o vacío y mi amigo me ayudó con esto:

StrengthInfo = CASE WHEN ((SELECT COUNT(UnitsOrdered) FROM [Data_Sub_orders].[dbo].[Snappy_Orders_Sub] WHERE IdPatient = @PatientId and IdDrugService = 226)> 0)
                            THEN cast((S.UnitsOrdered) as varchar(50))
                    ELSE 'No Labs Available'
                    END

Wow, una subconsulta. Eso no es caro en absoluto.
Jay Croghan el

0

Tienes que hacer las dos cosas:

SELECT * FROM Table WHERE Text IS NULL or Text LIKE ''


0

Sé que hay muchas respuestas con alternativas a este problema, pero me gustaría reunir lo que encontré como la mejor solución de @Eric Z Beard y @Tim Cooper con @Enrique Garcia y @Uli Köhler.

Si es necesario para lidiar con el hecho de que solo espacio podría ser lo mismo que vacío en su escenario de caso de uso, porque la consulta a continuación devolverá 1, no 0.

SELECT datalength(' ')

Por lo tanto, iría por algo como:

SELECT datalength(RTRIM(LTRIM(ISNULL([TextColumn], ''))))


0

En lugar de usar el isnulluso a case, debido al rendimiento, es mejor el caso.

case when campo is null then '' else campo end

En su problema, debe hacer esto:

case when campo is null then '' else
  case when len(campo) = 0 then '' else campo en
end

Código como este:

create table #tabla(
id int,
campo varchar(10)
)

insert into #tabla
values(1,null)

insert into #tabla
values(2,'')

insert into #tabla
values(3,null)

insert into #tabla
values(4,'dato4')

insert into #tabla
values(5,'dato5')

select id, case when campo is null then 'DATA NULL' else
  case when len(campo) = 0 then 'DATA EMPTY' else campo end
end
from #tabla

drop table #tabla

primero verifica si es nulo, luego usa la función len ... espero que ayude
Enrique Garcia

¿Qué sucede si la columna no es NULL y está vacía y no tiene texto?
Sayed Muhammad Idrees

0
DECLARE @temp as nvarchar(20)

SET @temp = NULL
--SET @temp = ''
--SET @temp = 'Test'

SELECT IIF(ISNULL(@temp,'')='','[Empty]',@temp)
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.