我有一个问题,即根据UI传入的变量标志更改where子句中的where语句。
在该方案中,数据库中有人员记录,目标是允许用户根据他们选择的条件查找重复项。可以将搜索选项的任何排列视为重复。
该示例简化了查询,但概念是相同的。这是否可以使用IF或CASE有条件地包含在联接中,或者每个排列是否需要是它自己的单独查询?
array_walk_recursive(
$myArray,
function (&$value) {
if (is_bool($value)) {
$value = 'I AM A BOOLEAN';
}
}
);
答案 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)以从完整查询中获取结果。