Я нашел принятый ответ немного медленнее:
SELECT col FROM tbl WHERE col LIKE '% ';
против этой техники:
SELECT col FROM tbl WHERE ASCII(RIGHT([value], 1)) = 32;
Идея состоит в том, чтобы получить последний символ, но вместо этого сравнивать его код ASCII
с кодом пробела ASCII
только с пробелом ' '
Если мы используем только ' '
пробел, пустая строка выдаст true:
DECLARE @EmptyString NVARCHAR(12) = '';
SELECT IIF(RIGHT(@EmptyString, 1) = ' ', 1, 0); -- this returns 1
Выше приведено из-за реализации сравнения строк в Microsoft .
Итак, как быстро?
Вы можете попробовать следующий код:
CREATE TABLE #DataSource
(
[RowID] INT PRIMARY KEY IDENTITY(1,1)
,[value] NVARCHAR(1024)
);
INSERT INTO #DataSource ([value])
SELECT TOP (1000000) 'text ' + CAST(ROW_NUMBER() OVER(ORDER BY t1.number) AS VARCHAR(12))
FROM master..spt_values t1
CROSS JOIN master..spt_values t2
UPDATE #DataSource
SET [value] = [value] + ' '
WHERE [RowID] = 100000;
SELECT *
FROM #DataSource
WHERE ASCII(RIGHT([value], 1)) = 32;
SELECT *
FROM #DataSource
WHERE [value] LIKE '% ';
На моей машине разница составляет около 1 секунды:
![enter image description here](https://i.stack.imgur.com/Qi41C.png)
Я проверил это на таблице с 600k строк, но большего размера, и разница была выше 8 секунд. Итак, насколько быстро это будет зависеть от ваших реальных данных.