Jak sprawdzić, czy kolumna tekstowa programu SQL Server jest pusta?

183

Korzystam z programu SQL Server 2005. Mam tabelę z kolumną tekstową i mam wiele wierszy w tabeli, w których wartość tej kolumny nie jest pusta, ale jest pusta. Próba porównania z „” daje następującą odpowiedź:

Typy danych text i varchar są niekompatybilne, ponieważ nie są równe operatorowi.

Czy istnieje specjalna funkcja określająca, czy wartość kolumny tekstowej nie jest pusta, ale pusta?

atoumey
źródło
1
Jeśli to możliwe, przekonwertowałbym typ danych na varchar (maks.), Tekst jest przestarzały - najlepiej zacząć wprowadzać zmiany teraz, jeśli dotykasz tabeli. Oczywiście skontaktuj się z dba. Ale im więcej rzeczy można nawrócić, zanim trzeba je nawrócić, tym lepsza jest moja myśl. Będzie to zależeć od tego, ile kodu używasz, na przykład, zawiera i pisze tekst, który zostanie złamany, czy to zrobić teraz, ale podnoszę go, więc masz świadomość, że w końcu trzeba to zmienić.
HLGEM

Odpowiedzi:

304
where datalength(mytextfield)=0
Eric Z Beard
źródło
2
To nie było prawdziwe pytanie, ale uwaga dla osób, które czytają tylko tytuł, nie zapomnij dodać, OR mytextfield IS NULLkiedy kolumna może byćNULL
Daan
2
mytextfield IS NULL *OR*:-)
zakaz geoinżynierii
3
@ ban-geoinżynieria SQL Server T-SQL nie honoruje technik oceny zwarć, więc zamówienie tutaj nie wpływa na wynik.
Conrad,
47
ISNULL(
case textcolum1
    WHEN '' THEN NULL
    ELSE textcolum1
END 
,textcolum2) textcolum1
Eric
źródło
Powyższe zapytanie faktycznie obsłuży naturę pustki i pustki kolumny tekstowej i odpowiednio przypisze wartość na podstawie warunku. Głosuj za odpowiedzią, ponieważ tego właśnie szukałem. Dzięki
użytkownik_v
28

W rzeczywistości wystarczy użyć operatora LIKE.

SELECT * FROM mytable WHERE mytextfield LIKE ''
Duńczyk
źródło
+1 Wolę tę odpowiedź od innych tutaj, ponieważ nie zależy ona od dodatkowego obciążenia wywołania funkcji SQL, takich jak DataLength (), IsNull () lub Cast (). Być może wygenerowany plan zapytań jest taki sam (nie sprawdziłem); wciąż uważam, że jest to znacznie czystsze podejście.
MikeTeeVee,
5

Aby uzyskać tylko puste wartości (a nie wartości zerowe):

SELECT * FROM myTable WHERE myColumn = ''

Aby uzyskać wartości puste i puste:

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

Aby uzyskać tylko wartości zerowe:

SELECT * FROM myTable WHERE myColumn IS NULL

Aby uzyskać wartości inne niż null i puste:

SELECT * FROM myTable WHERE myColumn <> ''


I pamiętaj, aby używać wyrażeń typu LIKE tylko wtedy, gdy jest to konieczne, ponieważ obniżą one wydajność w porównaniu do innych typów wyszukiwań.

Nima
źródło
Nie masz na myśli myColumn IS NOT NULL AND my column = '';?
bcsb1001,
2

Użyj operatora IS NULL:

Select * from tb_Employee where ename is null
Perła
źródło
1
atoumey stwierdza w pytaniu, że „wartość tej kolumny nie jest pusta, ale jest pusta”, dlatego ISNULL () nie działałby :)
GazB
2
SELECT * FROM TABLE
WHERE ISNULL(FIELD, '')=''
Enrique Garcia
źródło
1
upvoted, ale ... gdzie ISNULL (TRIM (Field), '') = '' jest jeszcze lepszy ;-), jeśli uważasz, że „” jest pustym ciągiem znaków, nawet ze spacjami w środku
Kirsten
W przypadku MySQL poprawna składnia to:SQL SELECT * FROM TABLE WHERE IFNULL(FIELD, '')=''
Cláudio Silva
1

Wiem, że ten post jest starożytny, ale uznałem go za przydatny.

Nie rozwiązało to problemu zwrócenia rekordu z niepustym polem tekstowym, więc pomyślałem, że dodam moje rozwiązanie.

To jest klauzula where, która zadziałała dla mnie.

WHERE xyz LIKE CAST('% %' as text)
Mike Roberts
źródło
1

Użyj metody DATALENGTH , na przykład:

SELECT length = DATALENGTH(myField)
FROM myTABLE
Jorgesys
źródło
0

Czy wartość null i pusty ciąg są równoważne? Jeśli tak, włączę logikę do mojej aplikacji (a może wyzwalacza, jeśli aplikacja jest „gotowa”?), Aby wymusić, aby pole było zerowe lub „”, ale nie drugie. Jeśli użyłeś '', możesz również ustawić kolumnę na NIE NULL. Tylko kwestia czystości danych.

Tyler Gooch
źródło
0

Chciałem mieć predefiniowany tekst („Brak dostępnych laboratoriów”), który będzie wyświetlany, jeśli wartość będzie pusta lub pusta, a mój przyjaciel pomógł mi w tym:

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
Yoosaf Abdulla
źródło
Wow, podzapytanie. To wcale nie jest drogie.
Jay Croghan
0

Musisz wykonać oba:

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

marklark
źródło
0

Wiem, że istnieje wiele odpowiedzi z alternatywami dla tego problemu, ale chciałbym tylko połączyć to, co uznałem za najlepsze rozwiązanie przez @Eric Z Beard i @Tim Cooper z @Enrique Garcia i @Uli Köhler.

W razie potrzeby, aby poradzić sobie z faktem, że tylko miejsce może być takie samo jak puste w twoim scenariuszu przypadku użycia, ponieważ poniższe zapytanie zwróci 1, a nie 0.

SELECT datalength(' ')

Dlatego wybrałbym coś takiego:

SELECT datalength(RTRIM(LTRIM(ISNULL([TextColumn], ''))))
Lew
źródło
0

Spróbuj tego:

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

mam nadzieję, że ci pomogę!

Luiz Fernando Corrêa Leite
źródło
0

Zamiast używać isnulluse a case, ze względu na wydajność lepiej jest to zrobić.

case when campo is null then '' else campo end

W swoim problemie musisz to zrobić:

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

Kod taki jak ten:

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
Enrique Garcia
źródło
najpierw sprawdzasz, czy ma wartość zero, a następnie używasz funkcji len ... mam nadzieję, że to pomoże
Enrique Garcia
Co jeśli kolumna nie ma wartości NULL i jest pusta bez tekstu?
Sayed Muhammad Idrees
0
DECLARE @temp as nvarchar(20)

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

SELECT IIF(ISNULL(@temp,'')='','[Empty]',@temp)
użytkownik11968038
źródło