Фильтр сложных запросов с использованием Like () в T-SQL - PullRequest
2 голосов
/ 10 апреля 2011

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

Общая идея заключается в том, чтобы иметь сценарий .sql, который определяет некоторые переменные вв верхней части запроса, а затем под ним находятся несколько сложных запросов, использующих эти переменные.

Проблема, с которой мы столкнулись, заключается в том, что мы хотим, чтобы бухгалтерия могла указать фильтр для использования.Например:

DECLARE @year INT
DECLARE @month INT
DECLARE @filter VARCHAR(30);

SET @year = 2010
SET @month = 7
SET @filter = '%test%'

Здесь команда может изменить месяц и год, который возвращают последующие запросы.Они также могут определять ОДИН элемент фильтра, в этом примере, исключая любые записи, в которых имя пользователя содержит строку 'test'.

Мой вопрос заключается в том, существует ли способ указать ИЛИ для LIKE().Например, в идеале у нас должна быть переменная @filter, например, '%test% или %other%.Теперь я знаю, что это ненастоящий синтаксис, но мне интересно, есть ли синтаксис, который позволяет мне достичь этого.Я поцарапал MSDN по синтаксису LIKE() без радости.Должен ли я использовать другое выражение запроса?

Ответы [ 2 ]

1 голос
/ 10 апреля 2011

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

DECLARE @tblFilter TABLE
    (sFilter nvarchar(MAX) NOT NULL);
INSERT @tblFilter 
    SELECT * FROM (VALUES ('%one%'), ('%two%'), ('%three%')) v(s);

DECLARE @tblData TABLE 
    (iId int NOT NULL PRIMARY KEY IDENTITY, 
     sData nvarchar(MAX));
INSERT @tblData(sData) 
    SELECT * FROM (VALUES ('one'), ('two three'), ('four')) v(s);

SELECT DISTINCT iId 
    FROM @tblData d 
    JOIN @tblFilter f ON d.sData LIKE f.sFilter;

Я предполагаю, что разные строки запроса находятся в таблице @tblFilter, которая может быть TVP, происходящим из XMLзначения из значений, разделенных запятыми, из временной таблицы и т. д.

1 голос
/ 10 апреля 2011

Вероятно, самое простое, что можно сделать, это просто иметь несколько параметров, хотя это и не очень красиво:

SET @filter_1 = '%test%'
SET @filter_2 = '%foo%'
SET @filter_3 = '%'
SET @filter_4 = '%'

SELECT *
FROM BAR
WHERE var LIKE @filter_1
   OR var LIKE @filter_2
   OR var LIKE @filter_3
   OR var LIKE @filter_4
   OR var LIKE @filter_5

По умолчанию их значение%, они всегда будут совпадать по умолчанию.

Вы также можете использовать динамический SQL и локальную переменную таблицы.По сути, создайте локальную таблицу с одним столбцом, разрешите им изменять операторы INSERT в эту таблицу, затем определите цикл, который выполняет итерацию по содержимому этой таблицы, чтобы динамически генерировать предложения LIKE.Это будет работать, но это будет немного больше кода.Приведенный выше пример быстрый и грязный, но я предполагаю, что этого достаточно для того, что вам нужно сделать.

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