【问题标题】:SQL Isnull is not working and returns a value even if it is a spaceSQL Isnull 不起作用并返回一个值,即使它是一个空格
【发布时间】:2017-08-02 12:57:24
【问题描述】:

我正在使用 SQL Server 2016,但遇到了 isnull 函数的问题。该字段中的值是一个空格,但一直被选中,下面是我的代码:

SELECT * FROM table
WHERE  isnull (field1,'')<>''
       AND field1<>' '

如果我从field1复制粘贴,就是一个空格''。

谢谢

【问题讨论】:

  • 空字符串是一个值...
  • 可能是其他不可见的 ascii 字符?
  • ASCII(field1) 为该行返回什么?这将显示第一个字符的 ascii 值。
  • 如果没记错的话,char(9) 是制表符,而不是空格。
  • 丁丁....我们有一个赢家。它不是一个空间。 space 是 32,tab 是 9。这就是它被返回的原因。

标签: sql sql-server sql-server-2016


【解决方案1】:

您的空间不是普通空间(十六进制 0x20,十进制 32)

select ASCII(LEFT(field1, 1), * From table
where  isnull (field1,'')<>''

很可能是其中之一

  • 换行十进制 10
  • 回车十进制 13
  • 零十进制0
  • 硬空格十进制 160
  • 制表符十进制 9(根据来自 @SeanLange 的问题的 cmets)

【讨论】:

    【解决方案2】:

    我发现这个问题的解决方案是:

    SELECT ISNULL(NULLIF(field1,''), field2)
    

    【讨论】:

      【解决方案3】:

      我已尝试将所有可能的组合放入 insert.. 试试这个

      Create table #t(Field1 varchar(100))
      Insert into #t values 
      (NULL), (' '), ('  '), ('a'),('')
      
      
      select  field1 From #t
      where LTRIM(RTRIM(field1)) <> ''
      

      输出:

      field1
      ---------
      a
      

      【讨论】:

      • 正如 Sean Lange 在 cmets 中所写,您可以删除 LTRIM 和 RTRIM,然后检查 field1 &gt; ''
      • 试试Insert into #t VALUES (CHAR(13)), (CHAR(10))
      • 感谢@NenadZivkovic:学到了一些新东西:)。 Nik Bo...在发布后看到了 Sean 的评论。不过还是谢谢。
      【解决方案4】:

      正如我们通过 cmets 和其他答案(尤其是 gbn)发现的那样,除了空格之外,可能还有其他不可见的字符。

      但这并没有为您提供如何编写查询的解决方案,可能类似于:

      where field1 NOT IN (CHAR(0), CHAR(9), CHAR(10), CHAR(11), CHAR(12), CHAR(13), CHAR(14), CHAR(32), CHAR(160))
      

      【讨论】:

        猜你喜欢
        • 2019-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-27
        • 1970-01-01
        • 2015-01-14
        • 2017-09-14
        相关资源
        最近更新 更多