2013-03-19 52 views
-3

在以下查询中,t2.stock它有两个值(10)。我想要1值的输出为IN0的值为OUT。问题是我不能在这种类型的查询中使用CASE表达式。有没有办法做到这一点?动态SQL中不能使用CASE表达式

use DB1 
go 

declare @SQL varchar(500), 

Set @SQL=' select t1.ID,t1.Name,t2.stock 
    from table1 t1 
     inner join table2 t2 on t1.ID = t2.ID' 

exec (@SQL) 
+7

为什么你不能使用'CASE'声明? – Lamak 2013-03-19 14:05:38

+0

同意@Lamak。请解释***为什么***不能使用'CASE'。 – 2013-03-19 16:20:10

回答

0

但是你可以动态SQL使用case声明:

use DB1 
go 

declare @SQL varchar(500), 

Set @SQL=' 
select t1.ID, t1.Name, (case when t2.stock = 1 then ''IN'' else ''OUT'' end) as stock 
from table1 t1 
    inner join table2 t2 on t1.ID = t2.ID 
' 

exec (@SQL) 
+3

OP *不能*使用“CASE”。 – Kermit 2013-03-19 14:15:50

+0

@AarolamaBluenk。 。 。声明是“问题是我不能在这种类型的查询中使用”CASE“语句”我认为用户不知道如何在动态SQL中使用case语句,如果存在环境限制或如果这是一项家庭作业,那么问题应该更清楚。 – 2013-03-19 14:31:58

+2

@ GordonLinoff我同意你的解释,但我们需要进一步澄清有关限制,这就是为什么我发表评论,而不是仅仅回答*使用'CASE' * – Lamak 2013-03-19 14:34:28

5

如果这种类型的查询的你的意思是一个动态查询,那么你可能有一些误解约CASE和/或动态查询。通常,在动态查询中使用CASE表达式可能没有问题,其中的一个示例可以在@Gordon Linoff's answer中看到。

但是,如果你绝对坚持,有在您的情况一种替代方案:

use DB1 
go 

declare @SQL varchar(500); 

Set @SQL=' select t1.ID, t1.Name, v.description as stock 
    from table1 t1 
     inner join table2 t2 on t1.ID = t2.ID 
     inner join ( values (1, ''IN''), (0, ''OUT'') ) t2 (stock, description) on t2.stock = v.stock 
'; 
exec (@SQL);