Подтвердить что ты не робот

SQL Server 2008: как найти конечные пробелы

Как найти все значения столбцов в столбце с конечными пробелами? Для начальных пространств просто было бы

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

Ответ 1

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

SELECT col FROM tbl WHERE col LIKE '% '

Ответ 2

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

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

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

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

Ответ 4

Это то, что сработало для меня:

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))

Ответ 5

SELECT * FROM tbl WHERE LEN(col) != DATALENGTH(col)

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

Ответ 6

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

Мой любимый параметр, предполагая, что вы намерены удалить любые ведущие и/или конечные пробелы, должен выполнить следующее, которое будет динамически создавать 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'

Ответ 7

Пробелы в SQL Server игнорируются, поэтому для меня даже начальный пробел не работал.

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

не будет работать, если есть только один пробел ('') или пробел ('')

поэтому я разработал следующее:

select * from [table] where substring(REPLACE(col, ' ', '#'),1,1) = '#'

Ответ 8

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

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

Ответ 9

Попробуйте следующее:

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

Ответ 10

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

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 секунд. Итак, насколько быстро это будет зависеть от ваших реальных данных.

Ответ 11

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

SELECT * FROM tbl WHERE NOT TRIM(col) = col

Ответ 12

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

выберите col_name из таблицы, где col_name, например '_'