Ответ 1
Да, он игнорирует конечные пробелы в сравнении.
Вы можете попытаться добавить разделительный символ.
SELECT count(*)
FROM mytable
WHERE col + 'X' = ' X';
Я хочу узнать записи, в которых определенный столбец содержит ровно одно пространство и ничего больше. Поэтому я написал первый из следующих запросов:
select COUNT(*)
from mytable
where col = ' ' -- One space
select COUNT(*)
from mytable
where col = ' ' -- Two spaces
select COUNT(*)
from mytable
where col = ' ' -- Three spaces
Однако все три запроса возвращают одни и те же записи. Не отличается ли Microsoft SQL Server от количества пробелов? Как я могу запросить ровно одно, два или более пробелов?
Да, он игнорирует конечные пробелы в сравнении.
Вы можете попытаться добавить разделительный символ.
SELECT count(*)
FROM mytable
WHERE col + 'X' = ' X';
Ссылка, опубликованная Иваном Старостиным в комментариях OP, дает хорошее объяснение, и я думаю, что он заслуживает полного ответа, а не просто комментария.
Чтобы подвести итог, попробуйте использовать LIKE вместо равенства:
select COUNT(*)
from mytable
where col LIKE ' ' -- one space
И вы также можете использовать DATALENGTH для вычисления количества байтов в поле для двойной проверки длины поля:
select col, DATALENGTH(col)
from mytable;
Обратите внимание, что DATALENGTH вернет другое значение, если col - VARCHAR vs NVARCHAR. VARCHAR хранит каждый символ как 1 байт, где NVARCHAR сохраняет каждый символ как 2 байта, так как NVARCHAR хранится в Unicode.
Вы можете комбинировать предложение DATALENGTH
с вашим запросом:
select COUNT(*)
from mytable
where col = ' '
and DATALENGTH(col) = 1
Вы можете заменить одиночное пространство одним символом (для примера §
), а затем поместить этот символ в свое место, where
условие:
declare @tmp table(col varchar(50))
insert into @tmp values
(' '),
(' '),
(' ')
select COUNT(*) as one_space_count
from @tmp
where replace(col,' ','§')='§'
select COUNT(*) as two_space_count
from @tmp
where replace(col,' ','§')='§§'
select COUNT(*) as three_space_count
from @tmp
where replace(col,' ','§')='§§§'
Результаты: