Как проверить, является ли текстовый столбец SQL Server пустым?


183

Я использую SQL Server 2005. У меня есть таблица с текстовым столбцом, и у меня есть много строк в таблице, где значение этого столбца не нулевое, но оно пустое. Попытка сравнить с '' дает следующий ответ:

Типы данных text и varchar несовместимы в операторе не равно.

Существует ли специальная функция для определения, является ли значение текстового столбца не пустым, а пустым?


1
Я бы преобразовал тип данных, если это возможно, в varchar (max), текст устарел - лучше всего начинать вносить изменения сейчас, если вы касаетесь таблицы. Проверьте с вашим DBA, конечно. Но чем больше вещей может быть обращено до того, как они должны быть обращены, тем лучше моя мысль. Это будет зависеть от того, сколько кода вы используете, например, содержит и пишет текст, который будет разбит на вопрос, делать ли это сейчас, но я поднимаю этот вопрос, так что вы знаете, что со временем это нужно будет изменить.
HLGEM

Ответы:


304
where datalength(mytextfield)=0

2
Это был не фактический вопрос, а просто замечание для людей, которые только читают заголовок, не забудьте добавить, OR mytextfield IS NULLкогда ваша колонка может бытьNULL
Даан

2
mytextfield IS NULL *OR*:-)
запрет геоинженерии

3
@ ban-geoengineering SQL Server T-SQL не учитывает методы оценки короткого замыкания, поэтому порядок здесь не влияет на результат.
Конрад

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

Приведенный выше запрос фактически обрабатывает ноль и пустоту текстового столбца и, соответственно, присваивает значение в зависимости от условия. Upvote за ответ, так как это то, что я искал. Спасибо
user_v

28

На самом деле, вы просто должны использовать оператор LIKE.

SELECT * FROM mytable WHERE mytextfield LIKE ''

+1 Я предпочитаю этот ответ другим, потому что он не зависит от дополнительных затрат на вызов функций SQL, таких как DataLength (), IsNull () или Cast (). Возможно, сгенерированный план запроса такой же (я не проверял); тем не менее я считаю, что это гораздо более чистый подход.
MikeTeeVee

5

Чтобы получить только пустые значения (а не нулевые значения):

SELECT * FROM myTable WHERE myColumn = ''

Чтобы получить как нулевые, так и пустые значения:

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

Чтобы получить только нулевые значения:

SELECT * FROM myTable WHERE myColumn IS NULL

Чтобы получить значения, отличные от null и empty:

SELECT * FROM myTable WHERE myColumn <> ''


И помните, используйте фразы LIKE только при необходимости, поскольку они ухудшают производительность по сравнению с другими типами поиска.


Ты имеешь в виду myColumn IS NOT NULL AND my column = '';?
bcsb1001

2

Используйте оператор IS NULL:

Select * from tb_Employee where ename is null

1
В вопросе atoumey говорится, что «значение этого столбца не является нулевым, но оно пустое», поэтому ISNULL () не будет работать :)
GazB

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

1
проголосовал, но ... где ISNULL (TRIM (Field), '') = '' еще лучше ;-), если вы чувствуете, что "" пустая строка даже с пробелами внутри
Кирстен

Для MySQL правильный синтаксис:SQL SELECT * FROM TABLE WHERE IFNULL(FIELD, '')=''
Клаудио Сильва

1

Я знаю, что этот пост древний, но я нашел его полезным.

Это не решило мою проблему возврата записи с непустым текстовым полем, поэтому я решил добавить свое решение.

Это пункт, который работал для меня.

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



0

Являются ли NULL и пустая строка эквивалентными? Если это так, я бы включил логику в свое приложение (или, может быть, триггер, если приложение «из коробки»?), Чтобы заставить поле быть либо нулевым, либо '', но не другим. Если вы выбрали '', то вы также можете установить для столбца значение NOT NULL. Просто вещь для очистки данных.


0

Я хотел, чтобы предопределенный текст («Нет доступных лабораторий») отображался, если значение было пустым или пустым, и мой друг помог мне с этим:

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

Вау, подзапрос. Это совсем не дорого.
Джей Кроган


0

Я знаю, что есть много ответов с альтернативами этой проблеме, но я просто хотел бы собрать то, что я нашел как лучшее решение @Eric Z Beard & @Tim Cooper с @Enrique Garcia & @Uli Köhler.

Если необходимо учесть тот факт, что только пробел может быть таким же, как пустой, в вашем сценарии использования, потому что запрос ниже вернет 1, а не 0.

SELECT datalength(' ')

Поэтому я бы пошел на что-то вроде:

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


0

Вместо использования isnulluse a case, из-за производительности это лучше.

case when campo is null then '' else campo end

В вашем выпуске вам нужно сделать это:

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

Код как это:

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

сначала вы проверяете значение null, а затем используете функцию len ... надеюсь, это поможет
Энрике Гарсия

Что если столбец не пуст и не имеет текста?
сказал Мухаммед Идриес

0
DECLARE @temp as nvarchar(20)

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

SELECT IIF(ISNULL(@temp,'')='','[Empty]',@temp)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.