Как найти все значения столбцов в столбце с конечными пробелами? Для начальных пространств просто было бы
select col from table where substring(col,1,1) = ' ';
Как найти все значения столбцов в столбце с конечными пробелами? Для начальных пространств просто было бы
select col from table where substring(col,1,1) = ' ';
Вы можете найти пробелы с LIKE
:
SELECT col FROM tbl WHERE col LIKE '% '
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
Очень простой способ - использовать функцию LEN. LEN будет обрезать конечные пробелы, но не предшествует пробелам, поэтому, если ваш LEN() отличается от вашего LEN (REVERSE()), вы получите все строки с конечными пробелами:
select col from table where LEN(col) <> LEN(REVERSE(col));
это также можно использовать для определения количества пробелов для более продвинутой логики.
Это то, что сработало для меня:
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))
SELECT * FROM tbl WHERE LEN(col) != DATALENGTH(col)
Должен также работать.
Есть несколько разных способов сделать это...
Мой любимый параметр, предполагая, что вы намерены удалить любые ведущие и/или конечные пробелы, должен выполнить следующее, которое будет динамически создавать 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'
Пробелы в SQL Server игнорируются, поэтому для меня даже начальный пробел не работал.
select col from table where substring(col,1,1) = ' '
не будет работать, если есть только один пробел ('') или пробел ('')
поэтому я разработал следующее:
select * from [table] where substring(REPLACE(col, ' ', '#'),1,1) = '#'
Вот еще одна альтернатива для конечных пробелов.
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
Попробуйте следующее:
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
Я нашел принятый ответ немного медленнее:
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 секунды:
Я проверил это на таблице с 600k строк, но большего размера, и разница была выше 8 секунд. Итак, насколько быстро это будет зависеть от ваших реальных данных.
Здесь можно найти записи с ведущими или конечными пробелами, включая табуляции и т.д.:
SELECT * FROM tbl WHERE NOT TRIM(col) = col
Мы можем попробовать подчеркнуть, чтобы найти записи, которые являются пробелами, хотя и не являются точным решением, например, используя "%%" или "", но я мог найти записи, которые являются пробелами.
выберите col_name из таблицы, где col_name, например '_'