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 语句,例如 select
或 where
子句(例如 select case when @val1 = 'Inventory' then ...
)
此外,一个 case 语句只能 return 一个标量值。您可以在 select 列表中使用 case
,它将在每一行上进行评估,但您不能将 when
或 then
作为结果集或table。你也不能 return 两个结果(即你的 select 来自 invData
和你的 select 来自 investoryId
如果 case
的内联特性似乎给您带来了太多限制,您可能只需要看一个不错的老式 if/else
来代替
嘿,我在存储过程中有以下查询代码:
/************************************/
/* 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 语句,例如 select
或 where
子句(例如 select case when @val1 = 'Inventory' then ...
)
此外,一个 case 语句只能 return 一个标量值。您可以在 select 列表中使用 case
,它将在每一行上进行评估,但您不能将 when
或 then
作为结果集或table。你也不能 return 两个结果(即你的 select 来自 invData
和你的 select 来自 investoryId
如果 case
的内联特性似乎给您带来了太多限制,您可能只需要看一个不错的老式 if/else
来代替