繁体   English   中英

SQL Server动态条件

[英]SQL Server Dynamic Condition for Where

假设我有两个表:

  • 学生:ID,姓名,年龄,班级等
  • 条件:Id,条件

列Condition.Condition包含一个SQL条件,例如“ std.Age> 2”或“ std.Class = 3”

我想要做以下事情:

SELECT std.Id as StudentId, con.Id as ConId
FROM   Students as std,
       Condition as con
WHERE  con.Condition

也许需要学生编号的功能?

我该如何实现?


学生们:

1 , Yossi, 25, 3..
2 , David, 22, 3..
3 , Jhon, 5, 2..
4 , Smith, 25, 4..

条件:

1 , Age > 3
2 , Class = 4
3 , Name LIKE '%i%'

结果将是(条件,Studnet):

(1,1) (1,2) (1,3) (1,4) // all are older than 3
(2,4)                   // only Smith is in class 4
(3,1) (3,2) (3,4)       // all except jhon have an i in their name

尝试以下查询:

DECLARE @CONDITIONS varchar(max) =
REPLACE(REPLACE((
SELECT'UNION ALL SELECT ID AS STUDENTID , ' + CONVERT(VARCHAR , ID ) + ' AS CONDITIONID FROM STUDENTS WHERE ' + CONDITION + ' ' 
FROM CONDITION
FOR XML PATH('')
) , '&LT;' , '<') , '&GT;' , '>') 

SET @CONDITIONS = (SELECT SUBSTRING(@CONDITIONS , 11 , LEN(@CONDITIONS)))

EXEC(@CONDITIONS)

这是应用条件的更一般化方式。 如果只想应用一个条件,则在查询中添加where子句,从中获取所有条件。 您可以针对一个或多个条件运行此查询。 目前,我已经编写了适用于所有条件的查询。

sqlfiddle

您必须构建一个包含条件的字符串,然后执行它。 这就是所谓的“动态SQL”

举个例子:

 DECLARE @sql Varchar(400)

 SELECT @sql = 'SELECT * FROM MyTable WHERE ' + condition
  FROM Conditions
 WHERE cond_key = 1

 -- This will yield you a full SQL statement, if the condition record
 -- is there.

 EXECUTE(@sql)            -- And this will execute it

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM