2013-05-15 122 views
0

如果a = 4想從testTable獲得所有記錄(6行)。 4是SP中的默認參數。案例表達式在where子句中

create table testTable(a int, b int, c int) 
go 
insert into testTable values(2, 101, 100000) 
go 
insert into testTable values(2, 101, 100001) 
go 
insert into testTable values(3, 101, 100002) 
go 
insert into testTable values(3, 102, 100003) 
go 
insert into testTable values(4, 1, 100004) 
go 
insert into testTable values(4, 1, 100005) 
go 

create proc SPtest 
       @a int = 4, 
       @b int = 1 
as 
select  * from testTable where a = @a and b = @b 

exec SPtest 2, 101 

以上工作正常。但我需要這樣的東西:

declare @a int 
set @a = 4 

select * 
from testTable 
where a = case @a when 4 then select distinct a from testTable end 
+0

'CASE'在SQL Server只能返回 「原子」 的價值觀 - 你不能運行'CASE'語句中的T-SQL代碼。你需要從表中讀取這些不同的值並將它們存儲在一個變量**之前**執行此選擇與案例在where子句 –

回答

0

有幾種方法來切割cookie,這似乎是最合乎邏輯的;

IF @a = 4 THEN 
BEGIN 
    SELECT * 
    FROM testTable 
END 
ELSE 
BEGIN 
    SELECT * 
    FROM testTable 
    WHERE a = @a and b = @b 
END 

或者,你可以使用一個或語句;

SELECT * 
FROM testTable 
WHERE @a = 4 or (a = @a and b = @b) 

祝你好運(會有評論,但我還沒有)。

問候,

+0

感謝您的嘗試,但我需要的是: –

+0

按下意外進入。我需要如果@a = 3或@a = 2才能看到2行。如果@a = 4,我需要查看所有6條記錄,而不用'IF'。這只是大查詢的補充。 –

0

請試試這個:

create proc SPtest 
    @a int = 4, 
    @b int = 1 
as 
if @a = 4 
    select distinct a from testTable 
else 
    select * from testTable where a = @a and b = @b 
go 
exec SPtest 
exec SPtest 3,101 
+0

通過使用'IF'很容易解決。我不想在SP中有兩次大的查詢。我想用「CASE」表達來解決問題,就像我在原始問題中所說的那樣。不管怎麼說,還是要謝謝你。 –

+0

試試這個:select * from testTable where @a = 4 or(a = @a and b = @b) – PollusB