2

可以是这样的形式吗?我尝试选择案例,但总是发生错误。如果有任何帮助,我将不胜感激。

 CREATE PROCEDURE searchStatement
    (
    @word1 varchar(50),
    @word2 varchar(50),
    @word3 varchar(50)
    )

as
select * from words where 1=1 
if @word1 <> '-1'
and word1 =@word1 
if @word2 <> '-1'
and word2 =@word2 
if @word3 <> '-1'
and word3 =@word3 
4

4 回答 4

4

您可以通过if语句检查条件并形成string query如下所示的,然后您可以query通过exec命令执行字符串。

declare @resultSet nvarchar(max)
set @resultSet = 'select *from searchStatement where 1= 1  '

if @word1 <> '-1' 
begin
set @resultSet = @resultSet +  ' and word1 = '+@word1
end

if @word2 <> '-1' 
begin
set @resultSet = @resultSet +  ' and word2 = '+@word2
end

if @word3 <> '-1' 
begin
set @resultSet = @resultSet +  ' and word3 = '+@word3
end

 exec(@resultSet)
于 2013-07-27T15:58:17.273 回答
2

你可以使用这个:

select *.
from word
where
    (@word1 = '-1' or word = @word1) and
    (@word2 = '-1' or word = @word2) and
    (@word3 = '-1' or word = @word3)

顺便说一句,如果你想给程序一个空参数,最好使用 null 而不是 -1

于 2013-07-27T15:28:46.430 回答
1

有多种方法可以做到这一点。最接近您的“如果想法”的是这样的:

select *
from word
where
  1 = 1 
  and
  case
    when @word1 <> '-1'
    then word1 = @word1
    else 1 = 1
  end 
  and
  case
    when @word2 <> '-1'
    then word2 = @word2
    else 1 = 1
  end 
  and
  case
    when @word3 <> '-1'
    then word3 = @word3
    else 1 = 1
  end

不过,有一些更容易理解的解决方案(就像其他答案中的解决方案一样)。

于 2013-07-27T15:38:26.550 回答
0

你不能像那样使用“如果”。使用这样的“位置”:

select * from words
where @word1 in ( '-1', word1)
and word2 in ( '-1', word2)
and word3 in ( '-1', word3);

恕我直言,使用IN()结果比使用更优雅的查询OR

于 2013-07-27T15:31:22.293 回答