varchar
s và bình đẳng là điều khó khăn trong TSQL. LEN
hàm cho biết:
Trả về số ký tự, thay vì số byte, của biểu thức chuỗi đã cho, loại trừ khoảng trống ở cuối .
Bạn cần sử dụng DATALENGTH
để có được một byte
đúng số lượng dữ liệu được đề cập. Nếu bạn có dữ liệu unicode, hãy lưu ý rằng giá trị bạn nhận được trong trường hợp này sẽ không giống với độ dài của văn bản.
print(DATALENGTH(' ')) --1
print(LEN(' ')) --0
Khi nói đến sự bình đẳng của các biểu thức, hai chuỗi được so sánh để bình đẳng như sau:
- Nhận chuỗi ngắn hơn
- Đệm có khoảng trống cho đến khi độ dài bằng với độ dài của chuỗi dài hơn
- So sánh cả hai
Đó là bước ở giữa gây ra kết quả không mong đợi - sau bước đó, bạn đang so sánh hiệu quả khoảng trắng với khoảng trắng - do đó chúng được coi là bằng nhau.
LIKE
hoạt động tốt hơn =
trong tình huống "khoảng trống" vì nó không thực hiện đệm trống trên mẫu bạn đang cố gắng đối sánh:
if '' = ' '
print 'eq'
else
print 'ne'
Sẽ cung cấp cho eq
trong khi:
if '' LIKE ' '
print 'eq'
else
print 'ne'
Sẽ cung cấp cho ne
Cẩn thận với LIKE
mặc dù:nó không đối xứng:nó coi khoảng trắng ở cuối là quan trọng trong mẫu (RHS) nhưng không phải là biểu thức đối sánh (LHS). Phần sau được lấy từ đây:
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