Пространства в выражении WHERE для SQL Server

Я хочу узнать записи, в которых определенный столбец содержит ровно одно пространство и ничего больше. Поэтому я написал первый из следующих запросов:

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 от количества пробелов? Как я могу запросить ровно одно, два или более пробелов?

Ответ 1

Да, он игнорирует конечные пробелы в сравнении.

Вы можете попытаться добавить разделительный символ.

SELECT count(*)
FROM mytable
WHERE col + 'X' = ' X';

Ответ 2

Ссылка, опубликованная Иваном Старостиным в комментариях 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.

Ответ 3

Вы можете комбинировать предложение DATALENGTH с вашим запросом:

   select COUNT(*)
   from mytable
   where col = ' '
   and DATALENGTH(col) = 1

Ответ 4

Вы можете заменить одиночное пространство одним символом (для примера §), а затем поместить этот символ в свое место, 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,' ','§')='§§§'

Результаты:

enter image description here