Выбор nvarchar 'like' в комбинации левой комбинации - внутренней комбинации - PullRequest
1 голос
/ 19 октября 2010

В настоящее время у меня есть запрос, который возвращает результаты на основе динамического набора условий

DataTable Items:
    ID   Title
    1    Some title
    2    Some other title
..etc..

.

DataTable Tags:
    ID   Tag
    1    'a1c'
    1    'a1d'
    2    'a2c'
..etc..

Мой текущий поисковый запрос:

select * from dbo.Items i
LEFT JOIN dbo.tags t
on i.ID = t.ID
INNER JOIN @input in
on (in.[input] = t.Tag or in.[input] is null)

Входные данные будут выглядеть примерно так:

DECLARE @input as inputTable_type
INSERT INTO @input VALUES ('a1c')

Я хотел бы использовать значение типа «a1%» в качестве входных данных, но когда я пытаюсь это сделать, я не получаю никаких результатов (хотя я и делаюзнаю, что такой запрос работает:

select * from dbo.Items i
INNER JOIN dbo.tags t
on i.ID = t.ID
and t.Tag like ('a1%')

К сожалению, я хочу, чтобы это был статический запрос, и, насколько мне известно, мне нужна комбинация LEFT JOIN - INNER JOIN, которую яиметь для того, чтобы иметь возможность передать VALUES (NULL) в хранимую процедуру.

Спасибо за любые мысли и помощь, и дайте мне знать, если я могу уточнить что-нибудь!

Ответы [ 2 ]

2 голосов
/ 19 октября 2010

Поскольку вы уже играете в веселые игры с внешним объединенным столом, почему бы не расширить игры? Простейшая версия - заменить равенство на LIKE; следующая простейшая версия - добавить термин ИЛИ:

SELECT *
  FROM dbo.Items i
  LEFT JOIN dbo.tags t ON i.ID = t.ID
 INNER JOIN @input  in ON (t.Tag = in.[input] OR
                           t.Tag LIKE in.[input] OR
                           in.[input] IS NULL)

Следующий уровень сложности (или я имею в виду «сложность»?) - добавить второй столбец в таблицу @input, в котором будет указано сравнение:

SELECT *
  FROM dbo.Items i
  LEFT JOIN dbo.tags t ON i.ID = t.ID
 INNER JOIN @input  in ON ((in.[type] = '=' AND t.Tag = in.[input]) OR
                           (in.[type] = '%' AND t.Tag LIKE in.[input]) OR
                           in.[input] IS NULL)

Я решил назвать дополнительный столбец «типом», и значение в нем - один символ, используя «=» для обозначения соединения на равенство и «%» для обозначения соединения типа LIKE.

1 голос
/ 19 октября 2010

Вместо того, чтобы пытаться сохранить «a1%» в вашей таблице @input, сохраните только «a1», тогда я думаю (непроверенный) код ниже даст вам то, что вы хотите.

select * 
    from dbo.Items i
        LEFT JOIN dbo.tags t
            INNER JOIN @input in
                on in.[input] = left(t.Tag, len(in.[input]))
            on i.ID = t.ID
    where (t.ID is not null or not exists(select 1 from @input))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...