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?


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

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

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 ''

+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ń.


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

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, '')=''

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)



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.


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

Wow, podzapytanie. To wcale nie jest drogie.
Jay Croghan

0

Musisz wykonać oba:

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


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], ''))))


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

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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.