Разница между like и = со значением ячейки = 0 - PullRequest
0 голосов
/ 26 июня 2018

Мой запрос

select * 
from table_name
where column_name is null or column_name = ''

Однако результат также включает значение ячейки = 0

Когда я изменяю запрос на:

where column_name is null or column_name like ''

ячейки со значением= 0 исключены.

Тип данных float.Почему результаты разные?Есть ли различия при использовании like и =?

1 Ответ

0 голосов
/ 26 июня 2018

LIKE соответствует символьному типу данных, и вы сравниваете пустую строку с =, поэтому в обоих случаях происходит неявное преобразование.

declare @t table (flt float)
insert into @t
values
(1234567891.123456789123456789),
(0.00001),
(0.00)

select 
    * 
    ,str(flt) --truncates the decimal, only pulling back the default toal length of 10
    ,AsciiDecimal = ascii(substring(str(flt),1,1)) --32 is ASCII decimal for space
from @t

Как вы увидите, это преобразование дополняет ваше значение пробелами.И в предложении LIKE '' указано все, что похоже на пространство, а в качестве = '' указано все, что равно пробелу.<space> 0 подобен пробелу, но не равен пробелу.

Помните, [FLOAT][2] - приблизительный тип данных, который нельзя точно представить.Используйте десятичные, когда вы можете.Во-вторых, вы можете просто использовать числовое сравнение вместо строковых.то есть where column_name != 0.Поскольку ваш столбец имеет тип FLOAT, вставка пробела сделает его 0.

declare @space table (flt float)
insert into @space
values
('')

select * from @space
...