【问题标题】:SQL Error (4145): An expression of non-boolean type specified in a context where condition is expected, near '('SQL 错误 (4145):在预期条件的上下文中指定的非布尔类型的表达式,靠近 '('
【发布时间】:2017-08-29 04:47:47
【问题描述】:

使用以下语句检查字段是否为空,如果为空,则需要显示“尚未批准”消息。否则我想得到下面提到的一些字段的连接结果。

select 
    iif(isnull(AppByENo1,'true'),'Not Yet Approved',AppByENo1+AppByDesg1+AppByDate1) as result
from myDB 
    where (E_No = '25')

但在尝试运行 sql 查询时出现上述错误。

请告知我在哪里犯了错误以及如何解决这个问题。

【问题讨论】:

  • 你的 E_No 数据类型是什么..?
  • 它是 nvarchar(50)
  • 'true' != true,但即使是这样,SQL Server 中也没有布尔文字,因为没有用户公开的布尔数据类型。

标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2012


【解决方案1】:

由于连接空值会产生空值(前提是您应该打开appropiate settings),如果需要,您可以使用简单的coalesce 来替换空值:

select 
    COALESCE(AppByENo1+AppByDesg1+AppByDate1,'Not Yet Approved') as result
from myDB 
    where (E_No = '25')

如果您坚持使用iif 方法,我会赞成:

iif(AppByENo1 is null,'Not Yet Approved',AppByENo1+AppByDesg1+AppByDate1)

例如一个实际的null 测试,而不是尝试识别不能自然出现的标记字符串并在isnull 之后执行字符串比较。

【讨论】:

  • 在 COALESCE() 中添加“尚未批准”作为下一个字段的想法不错。但我想通过比较单个字段来使其更快。
  • @Sixthsense - 真的 - 这是您应用程序的性能瓶颈吗?我更喜欢直截了当的可读代码,而不是实际上没有测量性能的“加速”代码。
  • 我同意你的看法。您建议的解决方案非常易于处理和阅读。但是查询将在 6000 万个数据上运行,并且将来可能会增长到另外 6000 万个。所以我试图让它更快,而不是重视可读性。
  • 我只是在这里展示了 3 个字段连接作为示例。但在真正的数据库连接发生在 10x5。 (即)每 10 个字段有 5 个 COALESCE() 函数。
【解决方案2】:

在 SELECT 子句中使用 CASE 语句而不是 IFF :

  SELECT CASE WHEN ISNULL(AppByENo1,'true') = 'true' THEN 'Not Yet Approved'
     ELSE AppByENo1+AppByDesg1+AppByDate1 END as result
  FROM myDB WHERE E_No = '25'

【讨论】:

  • 感谢您让我了解 Case Statement 的用法 :)
  • @Sixthsense,欢迎光临。
【解决方案3】:

试试这个:

select 
iif(isnull(AppByENo1,'true') = 'true','Not Yet Approved',AppByENo1+AppByDesg1+AppByDate1) as result
from myDB 
where (E_No = '25')

【讨论】:

  • 谢谢,这符合我的预期。它考虑了空操作的单个字段,所以这会更快(我希望)。
  • 这种方法的问题是你必须使用一个不会自然出现的哨兵值。如果AppByENo1 实际上可以等于true,那么它的处理方式与null 相同。如果你打算走iif 路线,我强烈建议只使用AppByENo1 is null 作为条件,而不是使用isnull 和字符串来做果味的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多