T-SQL 将 CASE When Then 添加到当前 SELECT 语句

T-SQL adding CASE When Then to current SELECT statements

嘿,我在存储过程中有以下查询代码:

/************************************/
/*            The Query             */
/************************************/
SELECT AMTddbox     AS NETWORK                      FROM mainpage_AMTdata
SELECT name         AS TYPE                         FROM typeOf
SELECT name         AS PHASE                        FROM IncrementPhase
SELECT theLevel     AS 'SUPPORT LEVEL'              FROM supportLevel
SELECT location     AS LOCATION                     FROM location

(CASE 
   WHEN 
    (@val1 = 'inventory') 
   THEN 
    SELECT invID        AS inventoryID              FROM invData
    SELECT name         AS invName                  FROM invUsers
END)

当然上面的 T-SQL 不工作是因为错误:

Procedure spExcelData, Line 30 [Batch Start Line 18] Incorrect syntax near the keyword 'SELECT'.

Procedure spExcelData, Line 32 [Batch Start Line 18] Incorrect syntax near ')'.

那么我怎样才能去做我想做的事情,以便我检查 @val 是否等于 inventory 或还有什么?如果它 确实 相等,那么我需要它 return 其他 2 select 语句连同上面的其他 5 个语句返回给我。

CASE 表达式在 SELECT 语句中,反之亦然。如果 @val1 对你的结果要改变你的 SELECT 语句的整个结构,比如使用不同的 table,那么你会想要使用 IF/ELSE。如果只是更改从同一个 table 返回的 columns/values,您可以在 SELECT 语句中使用 CASE 表达式:

SELECT CASE @val1 WHEN 'inventory' THEN invID ELSE OtherColumnName END as 
myColumn FROM invData

大小写是一个表达式。它不能像语句一样使用来控制流程。您需要在此处使用 IF 语句。

if @val1 = 'inventory'
begin
    SELECT invID AS inventoryID
    FROM invData

    SELECT name AS invName
    FROM invUsers
end

首先,您有 5 个不同的结果集,每个结果集只有一列。这是完全正确的,但如果要进行连接的 table 之间没有关系,我觉得有点奇怪。

至于错误,您只是在那里有一个浮动的 case 语句。您需要在更大的表达式上下文中使用 case 语句,例如 selectwhere 子句(例如 select case when @val1 = 'Inventory' then ...

此外,一个 case 语句只能 return 一个标量值。您可以在 select 列表中使用 case,它将在每一行上进行评估,但您不能将 whenthen 作为结果集或table。你也不能 return 两个结果(即你的 select 来自 invData 和你的 select 来自 investoryId

如果 case 的内联特性似乎给您带来了太多限制,您可能只需要看一个不错的老式 if/else 来代替