【问题标题】:SQL Join Critera in CASE StatementCASE 语句中的 SQL 连接条件
【发布时间】:2017-09-19 13:08:11
【问题描述】:

我想知道是否可以在 SQL 语句的 JOIN 标准上使用 CASE 语句。我已经尝试过以下方法,但我仍然收到错误,'' 或 =

周围的语法无效

我想要实现的是,根据@machineID 变量是否等于空格,在不同的条件下加入配置表。

有人可以告诉我是我的语法不正确还是不可能?我想知道它背后的理论,而不仅仅是一个解决方案。

Declare @MachineID int
Declare @TypeID int
Select @MachineID = 1
Select @TypeID = 1

INSERT #Results1 (ID, CustomerID, MachineID, NewStatus, StatusTime)
SELECT A.ID, C.CustomerID, A.MachineID, A.NewStatus, A.StatusTime
FROM Statetable A
INNER JOIN Configtable B
ON CASE WHEN @MachineID = ''
THEN A.StateID = B.StateID AND A.MachineID = B.MachineID AND B.TypeID = @TypeID
WHEN @MACHINEID <> = '' THEN...

【问题讨论】:

  • 在 ON 和 WHERE 子句中使用 AND/OR 而不是 case 表达式通常要好得多。
  • 如果条件不是基于表内的数据,那么我建议使用一些程序逻辑。
  • CASE 不是流控制语句。它是一种表达方式。一旦您了解了差异,您将更成功地将其应用到您的解决方案中。查看第一个答案并了解这个概念。此外,您需要了解数据类型。您将 @MachineID 定义为 int 但您将其与空字符串文字进行比较。这没有逻辑意义,但不幸的是它可以工作,因为 db 引擎会将空字符串转换为零。但不要依赖草率的编码和假设。
  • 您好,感谢您的回复。我现在可以看到流/表达控制之间的区别了。

标签: sql sql-server tsql case


【解决方案1】:

你不能那样使用它。你可以这样做:

ON 
(@MachineID = '' 
  AND  A.StateID = B.StateID AND A.MachineID = B.MachineID AND B.TypeID = @TypeID)
OR 
(@MACHINEID <> = '' 
  ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 2016-07-31
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多