SQL Server 2008: как найти конечные пробелы - PullRequest
32 голосов
/ 31 марта 2010

Как я могу найти все значения столбца в столбце, которые имеют конечные пробелы? Для ведущих пробелов это будет просто

select col from table where substring(col,1,1) = ' ';

Ответы [ 12 ]

56 голосов
/ 31 марта 2010

Вы можете найти пробелы с помощью LIKE:

SELECT col FROM tbl WHERE col LIKE '% '
7 голосов
/ 31 марта 2010

SQL Server 2005:

select col from tbl where right(col, 1) = ' '

В качестве демонстрации:

select 
    case when right('said Fred', 1) = ' ' then 1 else 0 end as NoTrail,
    case when right('said Fred ', 1) = ' ' then 1 else 0 end as WithTrail

возвращает

NoTrail WithTrail
0       1  
3 голосов
/ 17 октября 2016

Вот что у меня сработало:

select * from table_name where column_name not like RTRIM(column_name)

Это даст вам все записи, которые имеют пробелы.

Если вы хотите получить записи, которые имеют начальные или конечные пробелы, вы можете использовать это:

select * from table_name where column_name not like LTRIM(RTRIM(column_name))
3 голосов
/ 15 ноября 2013

Очень простой способ - использовать функцию LEN. LEN будет обрезать завершающие пробелы, но не предшествующие пробелы, поэтому, если ваш LEN () отличается от вашего LEN (REVERSE ()), вы получите все строки с конечными пробелами:

select col from table where LEN(col) <> LEN(REVERSE(col));

это также можно использовать для определения количества пробелов для более продвинутой логики.

1 голос
/ 30 марта 2017

Есть несколько способов сделать это ...

Мой любимый вариант, предполагая, что вы намерены удалить все начальные и / или конечные пробелы, - выполнить следующее, что динамически создаст T-SQL для UPDATE всех столбцов с нежелательным пробелом в их усеченном значении:

SELECT 
'UPDATE [<DatabaseName>].[dbo].['+TABLE_NAME+']
SET ['+COLUMN_NAME+']=LTRIM(RTRIM(['+COLUMN_NAME+']))
WHERE ['+COLUMN_NAME+']=LTRIM(RTRIM(['+COLUMN_NAME+']));'+CHAR(13)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME LIKE '<TableName>%' 
    AND DATA_TYPE!='date'
ORDER BY TABLE_NAME,COLUMN_NAME

Если вам действительно нужно их идентифицировать, попробуйте один из следующих запросов:

SELECT *
FROM [database].[schema].[table]
WHERE [col1]!=LTRIM(RTRIM([col1]))

Более динамический SQL:

SELECT 'SELECT ''['+TABLE_NAME+'].['+COLUMN_NAME+']'',*
FROM [<your database name>].[dbo].['+TABLE_NAME+']
WHERE ['+COLUMN_NAME+'] LIKE ''% ''
    OR ['+COLUMN_NAME+'] LIKE '' %'';
GO
'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME LIKE '<filter table name as desired>%'
    AND DATA_TYPE!='date'
1 голос
/ 30 марта 2014
SELECT * FROM tbl WHERE LEN(col) != DATALENGTH(col)

Должно работать также.

0 голосов
/ 10 июня 2019

Я нашел принятый ответ немного медленнее:

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

Я проверил это на таблице с 600k строк, но большего размера, и разница была выше 8 секунд. Итак, насколько быстро это будет зависеть от ваших реальных данных.

0 голосов
/ 07 октября 2017

Попробуйте это:

UPDATE Battles
SET name = CASE WHEN (LEN(name+'a')-1)>LEN(RTRIM(name))
THEN REPLICATE(' ', (LEN(name+'a')-1)- LEN(RTRIM(name)))+RTRIM(name)
ELSE name
END
0 голосов
/ 17 февраля 2014

Мы можем попытаться подчеркнуть подчеркивание, чтобы найти записи, которые являются пробелами, хотя это и не точное решение, такое как использование "%%" или "", но я мог бы найти записи, которые являются пробелами.

выберите имя столбца из таблицы, где имя столбца, как '_'

0 голосов
/ 15 ноября 2013

Вот еще одна альтернатива для конечных пробелов.

DECLARE @VALUE VARCHAR(50) = NULL

DECLARE @VALUE VARCHAR(50) = '  '

IF ((@VALUE IS NOT NULL) AND (LTRIM(RTRIM(@VALUE)) != ''))

BEGIN
   SELECT 'TRUE'
END
ELSE
BEGIN
   SELECT 'FALSE'
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...