Como verifico se uma coluna de texto do SQL Server está vazia?


183

Estou usando o SQL Server 2005. Tenho uma tabela com uma coluna de texto e muitas linhas na tabela em que o valor dessa coluna não é nulo, mas está vazio. Tentar comparar com '' gera esta resposta:

Os tipos de dados text e varchar são incompatíveis no operador not equal to.

Existe uma função especial para determinar se o valor de uma coluna de texto não é nulo, mas vazio?


1
Se possível, converteria o tipo de dados para varchar (max), o texto foi preterido - o melhor é começar a fazer as alterações agora se você estiver tocando na tabela. Verifique com o seu dba, é claro. Mas quanto mais as coisas puderem ser convertidas antes de serem convertidas, melhor será o meu pensamento. Depende da quantidade de código que você usa usando coisas como contém e escreve texto que será quebrado se deve ou não fazer isso agora, mas eu o trago, então você está ciente de que isso precisará ser alterado eventualmente.
HLGEM

Respostas:


304
where datalength(mytextfield)=0

2
Esta não foi a questão real, mas apenas uma observação para as pessoas que apenas ler o título, não se esqueça de adicionar OR mytextfield IS NULLao seu coluna pode serNULL
Daan

2
mytextfield IS NULL *OR*:-)
ban-geoengineering

3
@ ban-geoengineering SQL Server O T-SQL não respeita as técnicas de avaliação de curto-circuito, portanto, a ordem aqui não afeta o resultado.
Conrad

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

A consulta acima tratará realmente a natureza de nulidade e vazio de uma coluna de texto e, consequentemente, atribuirá valor com base na condição. Voto a favor da resposta, pois era isso que eu procurava. Obrigado
user_v

28

Na verdade, você só precisa usar o operador LIKE.

SELECT * FROM mytable WHERE mytextfield LIKE ''

+1 Prefiro essa resposta às outras aqui, porque ela não depende da sobrecarga adicional de chamar funções SQL como DataLength (), IsNull () ou Cast (). Talvez o plano de consulta gerado seja o mesmo (não verifiquei); ainda acho que essa é uma abordagem muito mais limpa.
MikeTeeVee 13/11/19

5

Para obter apenas valores vazios (e não valores nulos):

SELECT * FROM myTable WHERE myColumn = ''

Para obter valores nulos e vazios:

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

Para obter apenas valores nulos:

SELECT * FROM myTable WHERE myColumn IS NULL

Para obter valores diferentes de nulo e vazio:

SELECT * FROM myTable WHERE myColumn <> ''


E lembre-se de usar frases LIKE apenas quando necessário, pois elas prejudicam o desempenho em comparação com outros tipos de pesquisas.


Você não quer dizer myColumn IS NOT NULL AND my column = '';?
precisa saber é o seguinte

2

Use o operador IS NULL:

Select * from tb_Employee where ename is null

1
estados atoumey na pergunta que "o valor desta coluna não é nulo, mas é vazio", portanto, ISNULL () não iria funcionar :)
GazB

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

1
votado, mas ... onde ISNULL (TRIM (Field), '') = '' é ainda melhor ;-), se você sentir que "" é uma string vazia, mesmo com espaços internos
Kirsten

Para o MySQL, a sintaxe correta é:SQL SELECT * FROM TABLE WHERE IFNULL(FIELD, '')=''
Cláudio Silva

1

Eu sei que este post é antigo, mas achei útil.

Ele não resolveu meu problema de retornar o registro com um campo de texto não vazio, então pensei em adicionar minha solução.

Esta é a cláusula where que funcionou para mim.

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



0

Nulo e uma string vazia são equivalentes? Se estiverem, eu incluiria lógica no meu aplicativo (ou talvez um gatilho se o aplicativo for "pronto para uso"?) Para forçar o campo a ser nulo ou '', mas não o outro. Se você optou por '', também poderá definir a coluna como NÃO NULL. Apenas uma coisa de limpeza de dados.


0

Eu queria que um texto predefinido ("Nenhum laboratório disponível") fosse exibido se o valor fosse nulo ou vazio e meu amigo me ajudou com isso:

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

Uau, uma subconsulta. Isso não é caro.
Jay Croghan

0

Você precisa fazer as duas coisas:

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


0

Sei que há muitas respostas com alternativas para esse problema, mas gostaria de reunir o que encontrei como a melhor solução de @Eric Z Beard e @Tim Cooper com @Enrique Garcia & @Uli Köhler.

Se necessário, para lidar com o fato de que somente espaço pode ser o mesmo que vazio no cenário de casos de uso, porque a consulta abaixo retornará 1, e não 0.

SELECT datalength(' ')

Portanto, eu usaria algo como:

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


0

Em vez de usar isnulluse a case, por causa do desempenho, é melhor o caso.

case when campo is null then '' else campo end

No seu problema, você precisa fazer o seguinte:

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

você primeiro verificar se é nulo, então você usa a função len ... Espero que ajude
Enrique Garcia

E se a coluna não for NULL e vazia, sem texto?
Sayed Muhammad Idrees

0
DECLARE @temp as nvarchar(20)

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

SELECT IIF(ISNULL(@temp,'')='','[Empty]',@temp)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.