Динамическое условие JOIN для таблицы - PullRequest
1 голос
/ 23 сентября 2010

Я хочу избежать конкатенации строк для создания динамического запроса SQL в SQL 2008.

Как я могу достичь нижеуказанных функциональных возможностей, если вообще эффективно?

В таблице хранятся различные условия, которые пользователь выбрал для поиска в БД, используя одно или несколько значений для поиска в таблицах. Например, он может дать SSN или DOB или SSN и DOB.

Так что, если он дает несколько значений в качестве входных данных, тогда запрос должен найти записи, соответствующие ВСЕМ критериям. Для этого мне нужно создать запросы из показанных ниже двух таблиц

Мне всегда нужно возвращать personid, который может быть из таблицы person или из представления.

Условия поиска, заданные пользователем, будут сохранены в таблице «условий» ниже

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 голосов
/ 23 сентября 2010

Используйте приведенный ниже шаблон с функцией IsNull () или Coalesce ()

  Where ColumnName = IsNull(@InParameter, ColumnName) 

или с тем же шаблоном в условии соединения

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

И затем, если указан параметр, ql будет фильтровать или объединять на основе значения параметра, если оно не указано или равно нулю, запрос будет игнорировать его (ColumnValue = ColumnVale всегда имеет значение true (за исключением столбцов с нулевым значением)

EDITED: добавить еще одинпредикат «Условие соединения», поскольку в случае, когда вы не указали значение параметра, условие соединения всегда будет истинным, и, если в соединении не будет какого-либо другого условия предиката, вы фактически получите декартово произведение ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...