繁体   English   中英

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

[英]SQL Server 2008: How to find trailing spaces

如何找到具有尾随空格的列中的所有列值? 对于领先的空间,它只是

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

以上是因为微软的字符串比较实现

那么,究竟有多快?

您可以尝试以下代码:

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秒。 那么,究竟有多快取决于您的实际案例数据。

另一种方法是使用CHARINDEXREVERSE来实现这一点,如下所示:

select col1 from table1
WHERE charindex(' ', reverse(col1)) = 1

这里的例子

简单地使用下面的查询来获取在列中值的开头或结尾处具有任意数量空格的值。

 select * from table_name where column_name like ' %' or column_name like '% ';

我们可以尝试使用下划线来查找空白条目,但不是像使用'%%'或''这样的准确解决方案,但我可以找到空白的条目。

从表中选择col_name,其中col_name类似于'_'

以下是查找带有前导或尾随空格的记录的替代方法,包括选项卡等:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM