【发布时间】: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