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

183

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

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

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

atoumey
источник
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)
Майк Робертс
источник
1

Используйте метод DATALENGTH , например:

SELECT length = DATALENGTH(myField)
FROM myTABLE
Jorgesys
источник
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

Вы должны сделать оба:

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

marklark
источник
0

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

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

SELECT datalength(' ')

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

SELECT datalength(RTRIM(LTRIM(ISNULL([TextColumn], ''))))
Лео
источник
0

попробуй это:

select * from mytable where convert(varchar, mycolumn) = ''

я надеюсь помочь тебе!

Луис Фернандо Корреа Лейте
источник
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)
user11968038
источник