表上的动态JOIN条件

时间:2010-09-22 22:08:18

标签: sql sql-server-2008 dynamic join

我想避免字符串连接在SQL 2008中创建动态SQL查询。

如何有效地实现以下功能?

表格存储用户通过使用一个或多个值来搜索数据库来搜索数据库所选择的各种条件。对于例如他可以给SSN或DOB或SSN和DOB。

因此,如果他提供多个值作为输入,则查询需要查找与所有条件匹配的记录。这需要我从下面显示的两个表中创建查询

我总是需要返回personid,可能来自人员表或视图。

用户提供的搜索条件将存储在下面的“条件”表中

conditions
-------------
id,custid,dob,ssn,base

person
--------
id,firstname,ssn,dob

view
--------
id,personid,base

So, IF DOB is to be searched

SELECT p.personid from conditon c 
INNER JOIN person p
ON p.dob=c.dob
WHERE c.condition=1

IF SSN and base is to be searched

SELECT v.personid from conditon c 
INNER JOIN view v 
ON c.base=v.base
INNER JOIN person p
ON p.ssn=c.ssn
WHERE c.condition=1

IF SSN,DOB and base is to be searched

SELECT v.personid from conditon c 
INNER JOIN view v 
ON c.base=v.base
INNER JOIN person p
ON p.ssn=c.ssn
AND
p.dob=c.dob
WHERE c.condition=1

1 个答案:

答案 0 :(得分:0)

使用下面的模式与IsNull()或Coalesce()函数

  Where ColumnName = IsNull(@InParameter, ColumnName) 

或加入条件中的相同模式

   Join Table a 
      On [Other stuff]
           And ColumnName = IsNull(@InParameter, ColumnName)

然后,如果提供了参数,则ql将根据参数值进行过滤或连接,如果未提供或为null,则查询将忽略它(ColumnValue = ColumnVale始终为true(可为空的列除外)

EDITED:为Join Condition添加另一个谓词。因为,在你没有指定参数值的情况下,连接条件总是为真,并且,除非连接中有其他谓词条件,否则你将有效地获得笛卡尔积...