SQL Server - 如何查找列中带有空格的行

13

我想做类似的事情

select * from X where string.IsNullOrWhiteSpace(a)

列a为NOT NULL

那么在T-SQL中,获取所有仅包含空格(多个空格或制表符的组合)的列a的行的等效方法是什么?

同时,我宁愿不使用函数。


1
ISBLANK()怎么样? - Tripp Kinetics
2
@TrippKinetics ISBLANK 在 TSQL 中不起作用。 - shree.pat18
2
“Whitespace” 定义了一个广泛的集合:空格(至少有20种不同的空格),不间断空格,行分隔符,制表符,段落分隔符等。你能缩小范围吗?还是需要进行防御性设计,因为这是一次清理操作? - Anon
@Anon OP已经缩小范围了。C# string.IsNullOrWhiteSpace - paparazzo
1
@Anon 但是你改变了词语。IsNullOrWhiteSpace是一个定义好的集合。在我看来,“Whitespace”是泛指的。 - paparazzo
显示剩余4条评论
7个回答

19

你可以尝试这个:

select * 
from yourtable
where ltrim(rtrim(yourcolumn)) = ''

这个想法是,如果裁剪值后得到一个空字符串,那么一开始你所拥有的仅仅是空格。

你也可以这样做:

select *
from yourtable
where yourcolumn like ' '

请注意,我已在SQL Server 2008 R2上测试了第二个查询,但根据@gunr2171在评论中所述,它在2014年版上不起作用。

最后,如果您有制表符、回车或换行符,则上述方法将无法正常工作。您可以先将这些值替换为空字符串,然后使用第一个查询,如下所示:

select * 
from yourtable
where ltrim(rtrim(replace(replace(replace(yourcolumn,char(9),''),char(10),''),char(13),''))) = ''

char(9)char(10)char(13)分别用于制表符、换行符和回车符。


不处理 NULL 值。 - Stan
2
列a不为空 - OP表示它不会是空的,因此不处理null值。 - shree.pat18
你的第二个例子只有在值为单个空格时才有效。 - gunr2171
这也是我最初的想法,但它也适用于多个空格。演示:http://rextester.com/ACUUL22481 - shree.pat18
在2014服务器上对我无效。declare @temp nvarchar(max) = ' '; if(@temp like ' ') print 'yes' - gunr2171
显示剩余3条评论

12

我曾经遇到过一个问题,需要找出并清除数据库字段中所有的空格,但我发现有四种可能的空格类型(参考ASCII代码表):

  • 水平制表符(char(9))
  • 换行符(char(10))
  • 垂直制表符(char(11))
  • 空格(char(32))

也许这个查询可以帮到你。

SELECT @COLUMN
FROM @TABLE
WHERE @COLUMN like '%'+CHAR(9)+'%' or @COLUMN like '%'+CHAR(10)+'%'
or @COLUMN like '%'+CHAR(11)+'%' or @COLUMN like '%'+CHAR(32)+'%'

这对我来说是最简单的解决方案。 - Karlomanio
除此之外,这将选择类似于“hello world”的值,其中中间的空格是那4个字符之一。OP要求只有空格的行。 - Brian Davis

4

根据shree.pat18的评论,这里是可能的答案...

select * 
from yourtable
where ltrim(rtrim(yourcolumn)) = '' or yourcolumn is null

我想那应该就行了。

不确定这是否正确,但这将是我的第一次尝试。+1 - paparazzo

1

方法 string.IsNullOrWhiteSpace 检查了25 个不同的Unicode空格字符。在SQL Server2017+中,我们可以使用TRIM函数来进行等效检查:

DECLARE @whitespaces nvarchar(50) =
    NCHAR(0x0020) + NCHAR(0x00A0) + NCHAR(0x1680) + NCHAR(0x1680) + NCHAR(0x2001)
    + NCHAR(0x2002) + NCHAR(0x2003) + NCHAR(0x2004) + NCHAR(0x2005) + NCHAR(0x2006)
    + NCHAR(0x2007) + NCHAR(0x2008) + NCHAR(0x2009) + NCHAR(0x200A) + NCHAR(0x202F)
    + NCHAR(0x205F) + NCHAR(0x3000) + NCHAR(0x2028) + NCHAR(0x2029) + NCHAR(0x0009)
    + NCHAR(0x000A) + NCHAR(0x000B) + NCHAR(0x000C) + NCHAR(0x000D) + NCHAR(0x0085);

SELECT *
FROM X
WHERE a IS NULL OR TRIM(@whitespaces FROM a) = ''

由于在这个问题中a不为null,因此可以将其从WHERE子句中省略。


在较早版本的SQL Server中,修剪特定字符需要更多的努力,因此在大多数情况下,通常只需要正常的LTRIM。但是,如果您确实需要确切的C#等效项,则可以在此处查看如何修剪特定字符:

0
我会尝试这样做。
select *
from x
where len(ltrim(rtrim(coalesce(a,'')))) = 0

经过检查我的查询,似乎使用ltrim和rtrim是多余的,只需要使用一个即可。

以下内容将足够。

select *
from x
where len(ltrim(coalesce(a,''))) = 0

0

对于完整的ASCII空白字符(制表符、换行符、空格等)以及根据需要添加其他字符的灵活性,例如CHAR(0):

WITH
  num256 AS (
     SELECT TOP 256 ROW_NUMBER() OVER(ORDER BY (SELECT 1)) n
     FROM master.dbo.spt_values
  ),
  filter AS (
    SELECT CHAR(n-1) c FROM num256
    WHERE n NOT IN (0x09,0x0A,0x0B,0x0C,0x0D,0x20,0x85,0xA0)
  )
SELECT MyColumn
FROM MyTable
WHERE NOT EXISTS(
  SELECT 1
  FROM filter
  WHERE MyColumn LIKE '%'+c+'%'
)

-1
这是一个检查变量是否为 null 或空白的 If 语句示例(C# 中等效于 IsNullOrWhitespace)。
declare @temp nvarchar(max) = '      ';

if(@temp is null
    or
   LEN(LTRIM(RTRIM(@temp))) = 0)
begin
    print 'it is empty or null'
end

您可以通过在 where 子句中包含逻辑来使其成为内联。

select *
from someTable
where
    aValue is null
        or
    LEN(LTRIM(RTRIM(aValue))) = 0

同时使用LTRIM和RTRIM是多余的。如果值中有任何字符,无论你使用多少次修剪,它仍将保留该字符。 - Eric Scherrer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接