【问题标题】:sql server - how do i find rows with whitespace in a columnsql server - 我如何在列中找到带有空格的行
【发布时间】:2014-07-31 13:10:26
【问题描述】:

我想做类似的事情

select * from X where string.IsNullOrWhiteSpace(a)

a 列是NOT NULL

那么在 T-SQL 中 C#string.IsNullOrWhiteSpace 的等效项是什么来获取列 a 只有空格(多个空格或制表符的组合)的所有行?

另外,我宁愿避免使用 函数。

【问题讨论】:

  • ISBLANK() 怎么样?
  • 您还想将具有NULL 值的列视为空格?
  • @TrippKinetics ISBLANK 不适用于 TSQL
  • "Whitespace" 定义了一个宽泛的集合:空格(至少20种不同)、不间断空格、行分隔符、制表符、段落分隔符等。可以缩小范围,还是需要防守设计,因为这是一个消毒传球?
  • @Anon 但是你换词了。 IsNullOrWhiteSpace 是一个定义的集合。我心目中的“空白”很笼统。

标签: clr c# sql-server tsql whitespace


【解决方案1】:

这是一个 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 是多余的。如果值中有任何字符,则无论您对其进行多少次修剪,它仍将具有该字符。
【解决方案2】:

你可以试试这个:

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

这个想法是,如果修剪值留下一个空字符串,那么你首先拥有的只是空格。

你也可以这样做:

select *
from yourtable
where yourcolumn like ' '

请注意,我已经在 SQL Server 2008 R2 上测试了第二个查询,但正如 @gunr2171 在 cmets 中所述,它在 2014 年不起作用

最后,如果你有制表符、回车符或换行符,上面的就行不通了。您可以做的是首先将这些值替换为空白字符串,然后像这样使用第一个查询:

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

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

【讨论】:

  • 不处理 NULL 值。
  • "Column a is NOT NULL" - OP 说它不会,因此不处理空值。
  • 您的第二个示例仅在值为单个空格时才有效。
  • 这也是我最初的想法,但它也适用于多个空间。演示:rextester.com/ACUUL22481
  • 不适用于 2014 服务器。 declare @temp nvarchar(max) = ' '; if(@temp like ' ') print 'yes'
【解决方案3】:

我会尝试这样的事情

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

检查我的查询后,使用 ltrim 和 rtrim 似乎是多余的,只使用其中一个即可。

以下就足够了

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

【讨论】:

    【解决方案4】:

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

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

    我认为应该可以解决问题

    【讨论】:

    • 不确定这是否正确,但这是我的第一次尝试。 +1
    【解决方案5】:

    对于完整的 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+'%'
    )
    

    【讨论】:

      【解决方案6】:

      我只是遇到了这种特殊情况的问题,我需要找到并清理每个带有空格的字段,但我在我的数据库字段中发现了 4 种可能的空格(参考ASCII code table):

      • 水平制表符(char(9))
      • 换行(char(10))
      • 垂直制表符(char(9))
      • 空格(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)+'%'
      

      【讨论】:

      • 这对我来说是最简单的解决方案
      • 除了这会选择像“hello world”这样的值,其中中间的空格是这4个字符之一。 OP 询问只有空格的行。
      猜你喜欢
      • 1970-01-01
      • 2017-09-22
      • 2012-04-26
      • 1970-01-01
      • 2012-06-10
      • 2016-10-29
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多