SQL Server 2008:如何查找尾随空格

SQL Server 2008:如何查找尾随空格,sql,sql-server,string,tsql,sql-server-2008,Sql,Sql Server,String,Tsql,Sql Server 2008,如何在具有尾随空格的列中查找所有列值?对于前导空间,它将是简单的 select col from table where substring(col,1,1) = ' '; 您可以找到尾随空格,如下所示: 从tbl中选择列,其中列类似“%” SQL Server 2005: select col from tbl where right(col, 1) = ' ' 作为演示: select case when right('said Fred', 1) = ' ' then 1 e

如何在具有尾随空格的列中查找所有列值?对于前导空间,它将是简单的

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

您可以找到尾随空格,如下所示:


从tbl中选择列,其中列类似“%” 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 tbl WHERE NOT TRIM(col) = col

SQL Server中忽略了空格,因此对我来说,即使是前导空格也不起作用

从表中选择列,其中substringcol,1,1='' 如果只有一个空格“”或空白,则不起作用

所以我设计了如下:

从[table]中选择*,其中substringREPLACEcol',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

一个非常简单的方法是使用LEN函数。 LEN将修剪尾随空格,但不修剪前导空格,因此,如果LEN与LENREVERSE不同,则将得到所有带有尾随空格的行:

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

这也可以用来计算您有多少空间用于更高级的逻辑。

我们可以尝试使用下划线来查找空白项,虽然这不是像使用“%”或“”这样的精确解决方案,但我可以找到空白项

从col\u name(如“\u”)所在的表中选择col\u name

SELECT * FROM tbl WHERE LEN(col) != DATALENGTH(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))

有几种不同的方法可以做到这一点。。。 假设您打算删除任何前导和/或尾随空格,我最喜欢的选项是执行以下操作,这将动态创建T-SQL以将所有不需要空格的列更新为其修剪值:

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
更具动态性的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'
试试这个:

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
以上是因为微软的

那么,到底有多快

您可以尝试以下代码:

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秒。因此,准确的速度将取决于您的实际案例数据。

SQL Server中没有TRIM函数,并且在=比较中忽略尾随空格。好的,对不起,我认为这是标准SQL。不过,它在PostgreSQL中也能正常工作,我发现这个问题是因为我试图解决PostgreSQL的相同问题,所以它可能会帮助其他人。我知道这是一篇非常古老的文章,但我想知道,我是否想检查表中的任何列是否包含尾随空格?顺便说一句,我的表中有45个字段……我怎么能这样做?@10e5x这是另一个问题。我建议您将其作为另一个问题发布-@罗德里戈普拉斯:这要看情况。一个选项可以是创建一个额外的位列来存储计算值触发时间?字段是否以空格结尾。另一种选择是创建一个计算列来执行相同的操作。或者一个索引视图来做同样的事情。最后,使用子字符串获取最后一个字符并查看它是否是空格可能会更糟糕,但我怀疑这会更慢。要删除它,请执行以下操作:更新tablename SET columnname=RTRIMcolumnname。看,只有在上校不是内瓦查的地方。好的。根据for nvarchar,我们应该只比较DATALENGTH值的一半。这将找到所有以任何字符开头的值。SQL Server中忽略空格是什么意思。。。?也许你的意思是在子字符串函数的上下文中?@SQL_Underworld不确定OP是什么意思,但是对于“test”的实际db值,我为所有1返回了行。其中测试类似于“test”,2其中测试类似于“测试”,3。其中test='test'和4。其中test='test'。我还发现lentest是4而不是5。看起来所有的len,like和=都忽略了尾随空格。Thunder建议的子字符串技巧确实用a替换了空格,这样就可以使用len,like and=了。这可能是特定于编码的。它以什么方式超出顶部?请从tbl中选择col,其中col类似“%”
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 '% ';