【问题标题】:CASE statement bool errorCASE 语句布尔错误
【发布时间】:2011-06-10 00:28:05
【问题描述】:

如何将以下 WHERE CASE 语句更改为 bool 以使该语句起作用?它给了我错误“在预期条件的上下文中指定的非布尔类型的表达式。”

WHERE (dma.DeviceId = @DeviceID AND dma.AssociationStart = @Start AND dma.AssociationEnd = @End) AND
CASE WHEN (dma.AssociationEnd IS NOT NULL)
    THEN (SELECT m.TimeStamp FROM Measurements m WHERE m.TimeStamp BETWEEN @Start AND @End)
 ELSE 
    (SELECT m.TimeStamp FROM Measurements m WHERE m.TimeStamp BETWEEN @Start AND (SELECT SYSDATETIMEOFFSET()))
END

【问题讨论】:

  • 尝试将 (SELECT SYSDATETIMEOFFSET()) 更改为 SYSDATETIMEOFFSET()。它可能不会直接解决您的问题,但它会使您的代码更易于阅读。
  • 查看整个查询,而不仅仅是 WHERE 子句对上下文很有用。
  • 看起来您缺少比较。在WHERE 子句中,您需要将该CASE 语句的结果与其他内容进行比较。
  • 也许您可以写下整个 SQL 语句,也许还可以写下表格的一些示例行,以了解您想要实现的目标。

标签: sql case


【解决方案1】:

也许你打算这样做:

SELECT m.Timestamp FROM Measurements m
WHERE dma.DeviceId = @DeviceID
  AND dma.AssociationStart = @Start
  AND dma.AssociationEnd = @End
  AND m.Timestamp BETWEEN @Start AND COALESCE(@End, SYSDATETIMEOFFSET())

然而dma.AssociationEnd = @End 成功已经这一事实意味着dma.AssociationEnd@End 都不为空。所以COALESCE(以及原始问题中的整个CASE)是浪费时间。

(当然,这仅在具有dma 的较大SELECT 中才有意义。)

【讨论】:

  • @a1ex07:我现在已经完全重写了查询,所以甚至没有CASE。 :-)
【解决方案2】:

也许:

WHERE dma.DeviceId = @DeviceID
  AND dma.AssociationStart = @Start
  AND dma.AssociationEnd = @End
  AND EXISTS
    CASE WHEN (dma.AssociationEnd IS NOT NULL)
      THEN ( SELECT m.TimeStamp
             FROM Measurements m
             WHERE m.TimeStamp BETWEEN @Start AND @End
           )
      ELSE ( SELECT m.TimeStamp
             FROM Measurements m
             WHERE m.TimeStamp BETWEEN @Start AND SYSDATETIMEOFFSET()
           )
    END

【讨论】:

  • 我稍微调整了 where 语句,我现在可以选择 DeviceId 但是当它不想比较 AssociationStart 和 @Start 时。
  • WHERE dma.DeviceId = @DeviceID AND dma.AssociationStart > @Start AND dma.AssociationEnd = @End AND (m.TimeStamp BETWEEN @Start AND (CASE WHEN dma.AssociationEnd 为 NULL THEN (SELECT SYSDATETIMEOFFSET ()) ELSE @End END))
猜你喜欢
  • 2016-04-28
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2012-07-07
相关资源
最近更新 更多