Как вы можете использовать поисковые фильтры, которые могут принимать несколько поисковых значений? - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь создать отчеты с несколькими поисковыми фильтрами, и мне нужны эти поисковые фильтры, чтобы иметь возможность принимать несколько значений в качестве параметров поиска.

Create Proc [procedure_name](
  @name nvarchar(50) null,
  @center nvarchar(3)null,
  @branch nvarchar(6)null
)
As
Begin
  Select [column1], [column2], [column3], [column4]
  from table1 a
  left join table2 b
  on a.cid=b.cid and a.acc=b.acc
  Where @name is null or a.Name=@name
    and @center is null or a.center=@center
    and @branch is null or a.branch=@branch
End

Мне нужны эти параметры поиска, чтобы иметь возможность принимать несколько значений и фильтровать их в одной таблице, т.е. вместо @name = 'Mark' выдает весь результат, который имеет Mark Мне нужны @name = 'Mark', 'James', 'Adam', которые дают все результаты, которые имеют Mark, James и Adam.

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Во-первых, ваша существующая логика неверна.Должно быть:

where (@name is null or a.Name = @name) and
      (@center is null or a.center = @center) and
      (@branch is null or a.branch = @branch)

Для вашего исправления:

where (@name is null or a.Name in (select value from string_split(@name)) and
      (@center is null or a.center in (select value from string_split(@center)) and
      (@branch is null or a.branch in (select value from string_split(@branch))
0 голосов
/ 20 июня 2019

Используйте функцию SplitString, например, такую: Разделенная строка T-SQL

Теперь ваш запрос может фильтровать несколько значений, если вы передаете их через запятую.@name = 'Марк, Джеймс, Адам'

Вместо:

@name is null or a.Name=@name

используйте:

@name is null or a.Name in (select Name from dbo.splitstring(@name))

PS: кстати, при использовании такого родаоператоры catch-all Я всегда добавляю option (перекомпилировать) в конце, поэтому механизм SQL пересчитывает план выполнения в зависимости от переданных вами параметров.

...