Bagaimana cara memeriksa apakah kolom teks SQL Server kosong?


183

Saya menggunakan SQL Server 2005. Saya memiliki tabel dengan kolom teks dan saya memiliki banyak baris di tabel di mana nilai kolom ini bukan nol, tetapi kosong. Mencoba membandingkan dengan 'yang menghasilkan respons ini:

Teks tipe data dan varchar tidak kompatibel dalam tidak sama dengan operator.

Apakah ada fungsi khusus untuk menentukan apakah nilai kolom teks bukan nol tetapi kosong?


1
Saya akan mengonversi tipe data jika memungkinkan ke varchar (maks), teks telah usang - sebaiknya mulai membuat perubahan sekarang jika Anda menyentuh tabel. Periksa dengan dba Anda tentu saja. Tetapi semakin banyak hal yang dapat dipertobatkan sebelum mereka harus dipertobatkan, semakin baik adalah pemikiran saya. Ini akan tergantung pada seberapa banyak kode yang Anda gunakan menggunakan hal-hal seperti berisi dan menulis teks yang akan dipecah, apakah akan melakukan ini sekarang, tetapi saya memunculkannya, jadi Anda sadar bahwa ini akan perlu diubah pada akhirnya.
HLGEM

Jawaban:


304
where datalength(mytextfield)=0

2
Ini bukan pertanyaan yang sebenarnya, tetapi hanya komentar untuk orang-orang yang hanya membaca judul, jangan lupa untuk menambahkan OR mytextfield IS NULLkapan kolom Anda bisaNULL
Daan

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

3
@ larangan-geoengineering SQL Server T-SQL tidak menghormati teknik evaluasi arus pendek, jadi pesanan di sini tidak mempengaruhi hasilnya.
Conrad

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

Kueri di atas sebenarnya akan menangani sifat nullness dan kekosongan kolom teks dan karenanya memberikan nilai berdasarkan kondisi. Memilih jawaban karena inilah yang saya cari. Terima kasih
user_v

28

Sebenarnya, Anda hanya perlu menggunakan operator LIKE.

SELECT * FROM mytable WHERE mytextfield LIKE ''

+1 Saya lebih suka jawaban ini daripada yang lain di sini karena tidak bergantung pada overhead tambahan untuk memanggil Fungsi SQL seperti DataLength (), IsNull (), atau Cast (). Mungkin rencana permintaan yang dihasilkan sama (saya tidak memeriksa); masih saya menemukan ini menjadi pendekatan yang jauh lebih bersih.
MikeTeeVee

5

Untuk mendapatkan hanya nilai kosong (dan bukan nilai nol):

SELECT * FROM myTable WHERE myColumn = ''

Untuk mendapatkan nilai nol dan kosong:

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

Untuk mendapatkan nilai nol saja:

SELECT * FROM myTable WHERE myColumn IS NULL

Untuk mendapatkan nilai selain nol dan kosong:

SELECT * FROM myTable WHERE myColumn <> ''


Dan ingat, gunakan frase LIKE hanya saat diperlukan karena mereka akan menurunkan kinerja dibandingkan dengan jenis pencarian lainnya.


Bukankah maksud Anda myColumn IS NOT NULL AND my column = '';?
bcsb1001

2

Gunakan operator IS NULL:

Select * from tb_Employee where ename is null

1
atoumey menyatakan dalam pertanyaan bahwa "nilai kolom ini bukan nol, tetapi kosong" karena itu ISNULL () tidak akan bekerja :)
GazB

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

1
terbalik, tetapi ... di mana ISNULL (TRIM (Field), '') = '' bahkan lebih baik ;-), jika Anda merasa bahwa "" adalah string kosong bahkan dengan spasi di dalam
Kirsten

Untuk MySQL, sintaks yang benar adalah:SQL SELECT * FROM TABLE WHERE IFNULL(FIELD, '')=''
Cláudio Silva

1

Saya tahu posting ini kuno tetapi, saya merasa berguna.

Itu tidak menyelesaikan masalah saya mengembalikan catatan dengan bidang teks yang tidak kosong jadi saya pikir saya akan menambahkan solusi saya.

Di sinilah klausa yang bekerja untuk saya.

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



0

Apakah null dan string kosong setara? Jika ya, saya akan memasukkan logika dalam aplikasi saya (atau mungkin pemicu jika aplikasi "out-of-the-box"?) Untuk memaksa bidang menjadi nol atau '', tetapi tidak yang lain. Jika Anda menggunakan '', maka Anda dapat mengatur kolom ke NOT NULL juga. Hanya hal kebersihan data.


0

Saya ingin memiliki teks yang telah ditetapkan ("Tidak Ada Labs") untuk ditampilkan jika nilainya nol atau kosong dan teman saya membantu saya dengan ini:

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, sebuah subquery. Itu sama sekali tidak mahal.
Jay Croghan

0

Anda harus melakukan keduanya:

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


0

Saya tahu ada banyak jawaban dengan alternatif untuk masalah ini, tetapi saya hanya ingin menyatukan apa yang saya temukan sebagai solusi terbaik oleh @Eric Z Beard & @Tim Cooper dengan @Enrique Garcia & @Uli Köhler.

Jika perlu berurusan dengan fakta bahwa space-only bisa sama dengan kosong dalam skenario use-case Anda, karena permintaan di bawah ini akan mengembalikan 1, bukan 0.

SELECT datalength(' ')

Karena itu, saya akan mencari sesuatu seperti:

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


0

Alih-alih menggunakan isnullgunakan case, karena kinerja lebih baik terjadi.

case when campo is null then '' else campo end

Dalam masalah Anda, Anda perlu melakukan ini:

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

Kode seperti ini:

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

Anda pertama kali memeriksa apakah nol, maka Anda menggunakan fungsi len ... saya harap ini membantu
Enrique Garcia

Bagaimana jika Kolom tidak NULL dan Kosong, tidak memiliki Teks?
Sayed Muhammad Idrees

0
DECLARE @temp as nvarchar(20)

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

SELECT IIF(ISNULL(@temp,'')='','[Empty]',@temp)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.