varchar
s dan kesetaraan sangat sulit di TSQL. LEN
fungsi mengatakan:
Mengembalikan jumlah karakter, bukan jumlah byte, dari ekspresi string yang diberikan, tidak termasuk trailing blank .
Anda perlu menggunakan DATALENGTH
untuk mendapatkan byte
yang sebenarnya jumlah data yang bersangkutan. Jika Anda memiliki data unicode, perhatikan bahwa nilai yang Anda dapatkan dalam situasi ini tidak akan sama dengan panjang teks.
print(DATALENGTH(' ')) --1
print(LEN(' ')) --0
Dalam hal persamaan ekspresi, kedua string tersebut dibandingkan untuk persamaan seperti ini:
- Dapatkan string yang lebih pendek
- Pad dengan kosong sampai panjangnya sama dengan string yang lebih panjang
- Bandingkan keduanya
Ini adalah langkah tengah yang menyebabkan hasil yang tidak diharapkan - setelah langkah itu, Anda secara efektif membandingkan spasi putih dengan spasi putih - karena itu keduanya terlihat sama.
LIKE
berperilaku lebih baik daripada =
dalam situasi "kosong" karena tidak melakukan pengisian kosong pada pola yang Anda coba cocokkan:
if '' = ' '
print 'eq'
else
print 'ne'
Akan memberikan eq
sementara:
if '' LIKE ' '
print 'eq'
else
print 'ne'
Akan memberikan ne
Hati-hati dengan LIKE
meskipun:tidak simetris:ia memperlakukan spasi putih sebagai signifikan dalam pola (RHS) tetapi bukan ekspresi kecocokan (LHS). Berikut ini diambil dari sini:
declare @Space nvarchar(10)
declare @Space2 nvarchar(10)
set @Space = ''
set @Space2 = ' '
if @Space like @Space2
print '@Space Like @Space2'
else
print '@Space Not Like @Space2'
if @Space2 like @Space
print '@Space2 Like @Space'
else
print '@Space2 Not Like @Space'
@Space Not Like @Space2
@Space2 Like @Space