基于Variable - SQL Server的条件连接语句

时间:2015-06-19 14:30:32

标签: sql-server

我有一个问题,即根据UI传入的变量标志更改where子句中的where语句。

在该方案中,数据库中有人员记录,目标是允许用户根据他们选择的条件查找重复项。可以将搜索选项的任何排列视为重复。

该示例简化了查询,但概念是相同的。这是否可以使用IF或CASE有条件地包含在联接中,或者每个排列是否需要是它自己的单独查询?

array_walk_recursive(
    $myArray,
    function (&$value) {
        if (is_bool($value)) {
            $value = 'I AM A BOOLEAN';
        }
    }
);

2 个答案:

答案 0 :(得分:1)

假设至少1个值是'Y',这应该可行。我还为所有变量添加了数据类型,并将它们更改为char(1),因为varchar(1)非常愚蠢。不确定你要用这个来完成什么,但你有一个所谓的三角形连接(<>谓词),这可能会导致非常糟糕的性能问题。 http://www.sqlservercentral.com/articles/T-SQL/61539/

此外,您需要停止以明文形式存储SSN。它需要用盐进行哈希处理或至少加密。

Declare @lastnamedup char(1) = 'N',
        @firstnamedup char(1) = 'N',
        @DOBdup char(1) = 'N',
        @SSNdup char(1) = 'N',
        @ZIPdup char(1) = 'N'

/*UI values passed could set any to Y*/

select
   p.id
   p.lastname,
   p.firstname,
   p.SSN,
   p.DOB,
   p.Address1,
   p.Address2,
   p.zip
   p.phone
from person p
join person p2 on p.id <> p2.id
    AND
    (
        (p.lastname = p2.lastname and @lastnamedup = 'Y')
        OR
        (p.firstname = p2.firstname and @firstnamedup = 'Y')
        OR
        (p.DOB = p2.DOB and @DOBdup = 'Y')
        OR
        (p.SSN = p2.SSN and @SSNdup = 'Y')
        OR
        (p.zip = p2.zip and @ZIPdup = 'Y')
    )

答案 1 :(得分:0)

您可以做的是使用或语句添加联接,您可以在其中检查参数的值,但最终仍会以联接结束。您还可以在nvarchar变量(@SQL)中构建SQL命令,在需要的地方添加连接,然后执行EXECUTE(@SQL)以从完整查询中获取结果。