我正在尝试使用案例中的案例在tsql中执行select语句。首先是基于SearchField的内容。接下来我需要基于SearchOper来完成它。
declare @searchField varchar(50)
declare @searchString varchar(50)
declare @searchOper varchar(50)
case @searchField
when 'CompanyName' then
case @searchOper
when 'eq' then
select * from tbl1 where CompanyName = @searchString
when 'ne' then
select * from tbl1 where CompanyName <> @searchString
end
when 'StoreNum' then
case @searchOper
when 'eq' then
select * from tbl1 where StoreNum = @searchString
when 'ne' then
select * from tbl1 where StoreNum <> @searchString
end
end
注意我要做的是在case语句中做一个select。
我收到一条消息,说关键字'case'附近的语法不正确。
答案 0 :(得分:5)
根据您的示例,您可能希望使用IF语句(以下是ELSE的示例,但您也可以多次使用IF和ELSE IF):
declare @searchField varchar(50)
declare @searchString varchar(50)
declare @searchOper varchar(50)
IF @searchField='CompanyName'
BEGIN
IF @searchOper='eq'
BEGIN
select * from tbl1 where CompanyName = @searchString
END
ELSE
BEGIN
select * from tbl1 where CompanyName <> @searchString
END
END
ELSE
BEGIN
IF @searchOper='eq'
BEGIN
select * from tbl1 where StoreNum = @searchString
END
ELSE
select * from tbl1 where StoreNum <> @searchString
END
END
CASE非常相似,但更适用于内联语句(即SELECT CASE 1 = 1 THEN'a'ELSE'b'END)。
答案 1 :(得分:1)
declare @searchField varchar(50)
declare @searchString varchar(50)
declare @searchOper varchar(50)
select *
from tbl1
where (@searchField <> 'companyName'
or
@searchOper = 'eq' and CompanyName = @searchString
or
@searchOper = 'ne' and CompanyName <> @searchString)
AND (@searchField <> 'StoreNum'
or
@searchOper = 'eq' and CompanyName = @searchString
or
@searchOper = 'ne' and CompanyName <> @searchString)
option (recompile)
这是编写它的一种方式,它应该执行正常。您所拥有的是www.sommarskog.se/dyn-search.html的变体,但OPTION (RECOMPILE)
每次仍应生成最佳计划。
答案 2 :(得分:0)
declare @searchField varchar(50)
declare @searchString varchar(50)
declare @searchOper varchar(50)
SELECT
(case @searchField
when 'CompanyName' then
(case @searchOper
when 'eq' then
(select * from tbl1 where CompanyName = @searchString)
when 'ne' then
(select * from tbl1 where CompanyName <> @searchString)
end
)
when 'StoreNum' then
(case @searchOper
when 'eq' then
(select * from tbl1 where StoreNum = @searchString)
when 'ne' then
( select * from tbl1 where StoreNum <> @searchString)
end
)
end
) a
我懒得建立tbl1,把它改成getdate而不是
declare @searchField varchar(50)
declare @searchString varchar(50)
declare @searchOper varchar(50)
SET @searchField = 'CompanyName'
SET @searchOper = 'eq'
SELECT
(case @searchField
when 'CompanyName' then
(case @searchOper
when 'eq' then
(select getdate())
when 'ne' then
(select getdate())
end
)
when 'StoreNum' then
(case @searchOper
when 'eq' then
(select getdate())
when 'ne' then
( select getdate())
end
)
end
) a
答案 3 :(得分:0)