我有一个Attributes表,它有一组由唯一编号标识的属性,然后是它们的描述 - 示例模式是
ID - AttributeName
下面有一些样本数据
1 = FirstName
2 = LastName
3 = Phone
然后我有一个雇员表,为简单起见,该表有以下方案
ID - PersonID
AttribueID - INT Foreign key to the above attributes table
我需要创建一个存储过程,给定条件将根据以下条件之一返回记录
如果我将1传递给存储过程,则proc应返回Person表中与属性ID 1匹配的所有记录(名字) 如果我将2传递给存储过程,则proc应该返回Person表中的所有记录,其中* DO * *不匹配属性ID 1(名字) 如果我将3传递给存储过程,则proc应返回Person表中的所有记录
我可以做以下事情,但觉得这不是最好的方式
DECLARE @IntID INT = 1 -- Set as 1 just for exmple
IF @IntID =1
BEGIN
SELECT * FROM Person where AttributeID IN (SELECT ID from Attributes Where ID =1) -- match on attribute 1
END
ELSE IF @IntID = 2
BEGIN
SELECT * FROM Person where AttributeID NOT IN (SELECT ID from Attributes Where ID =1) -- do not match on attribute 1
END
ELSE
BEGIN
SELECT * FROM Person where AttributeID IN (SELECT ID from Attributes) -- return match on all attributes
END
上面的例子有一个非常简单的SELECT语句 - 在真正的SQL中有一个更大的集合
提前致谢
答案 0 :(得分:0)
如果您不想使用动态SQL,那么您可以试试这个。而且您的查询太简单了,对于性能优化,您可能会查看表索引。
DECLARE @IntID INT = 1 -- Set as 1 just for exmple
IF @IntID = 1 OR @IntID = 2
BEGIN
SELECT A.*
FROM Person A
LEFT JOIN Attributes B ON A.AttributeID = B.ID AND B.ID = 1
WHERE
A.AttributeID IS CASE @IntID WHEN 1 THEN NOT NULL WHEN 2 THEN NULL END
END
ELSE
BEGIN
SELECT A.*
FROM Person A
INNER JOIN Attributes B ON A.AttributeID = B.ID
END