【发布时间】:2011-02-02 21:21:24
【问题描述】:
如何在包含尾随空格的列中找到所有列值?对于前导空格,它只是
select col from table where substring(col,1,1) = ' ';
【问题讨论】:
标签: sql sql-server string tsql sql-server-2008
如何在包含尾随空格的列中找到所有列值?对于前导空格,它只是
select col from table where substring(col,1,1) = ' ';
【问题讨论】:
标签: sql sql-server string tsql sql-server-2008
你可以用LIKE找到尾随空格:
SELECT col FROM tbl WHERE col LIKE '% '
【讨论】:
UPDATE tablename SET columnname = RTRIM(columnname)。见this answer。
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
【讨论】:
这对我有用:
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))
【讨论】:
一个非常简单的方法是使用 LEN 函数。 LEN 将修剪尾随空格但不会修剪前面的空格,因此如果您的 LEN() 与您的 LEN(REVERSE()) 不同,您将获得所有带有尾随空格的行:
select col from table where LEN(col) <> LEN(REVERSE(col));
这也可以用来计算你有多少空间用于更高级的逻辑。
【讨论】:
SELECT * FROM tbl WHERE LEN(col) != DATALENGTH(col)
应该也可以。
【讨论】:
nvarchar,我们应该只比较DATALENGTH 值的一半。
有几种不同的方法可以做到这一点...
假设您的意图是删除任何前导和/或尾随空格,我最喜欢的选项是执行以下操作,这将动态创建 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'
【讨论】:
这是查找带有前导或尾随空格的记录的替代方法,包括制表符等:
SELECT * FROM tbl WHERE NOT TRIM(col) = col
【讨论】:
TRIM 函数,在= 比较中无论如何都会忽略尾随空格。
试试这个:
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
【讨论】:
SQL Server 中忽略了空格,所以对我来说,即使是前导空格也不起作用。
select col from table where substring(col,1,1) = ' '
如果只有一个空格 (' ') 或空白 ('') 将不起作用
所以我设计了以下内容:
select * from [table] where substring(REPLACE(col, ' ', '#'),1,1) = '#'
【讨论】:
where test like 'test'、2.'where test like 'test '、3.@ 的行987654325@ 和 4.where test='test '。我还发现len(test) 是 4 而不是 5。所以似乎所有的 len 和 = 都忽略了尾随空格。 Thunder 建议的子字符串技巧确实用 # 替换了空格,因此可以使用 len、like 和 =。这可能是特定于编码的。
这是尾随空格的另一种选择。
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
【讨论】:
我发现接受的答案有点慢:
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
以上是因为微软的implementation of string comparisons。
那么,到底有多快?
你可以试试下面的代码:
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 秒以上。所以,究竟有多快取决于您的真实案例数据。
【讨论】:
我们可以尝试下划线来查找空白条目,虽然不是使用'%%'或''这样的准确解决方案,但我可以找到空白条目。
从 col_name like '_' 的表中选择 col_name
【讨论】: