SQL не нравится сравнение с динамическим списком - PullRequest
0 голосов
/ 13 февраля 2019

Работая над новой хранимой процедурой TSQL, я хочу получить все строки, в которых значения в определенном столбце не начинаются с какого-либо определенного набора из 2 символьных подстрок.

Общая идея заключается в следующем:

SELECT * FROM table WHERE value NOT LIKE 's1%' AND value NOT LIKE 's2%' AND value NOT LIKE 's3%'.

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

Пока у меня естьникогда раньше не использовал оператор IN, я думаю, что что-то в этом роде должно делать то, что я ищу, однако я не думаю, что возможно использовать подстановочные знаки с IN, поэтому я не смогу сравнивать простоподстроки.

SELECT * FROM table WHERE value NOT IN (SELECT substrings FROM subTable)

Чтобы обойти это ограничение, я пытаюсь сделать что-то вроде этого:

SELECT * FROM table WHERE SUBSTRING(value, 1, 2) NOT IN (SELECT Prefix FROM subTable WHERE Prefix IS NOT NULL)

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

1 Ответ

0 голосов
/ 13 февраля 2019

Вот вариант.Загрузите значения, которые вы хотите отфильтровать в таблицу, оставьте внешнее объединение и используйте PATINDEX () .

DECLARE @FilterValues TABLE
    (
        [FilterValue] NVARCHAR(10)
    );

--Table with values we want filter on.
INSERT INTO @FilterValues (
                              [FilterValue]
                          )
VALUES ( N's1' )
     , ( N's2' )
     , ( N's3' );

DECLARE @TestData TABLE
    (
        [TestValues] NVARCHAR(100)
    );

--Load some test data
INSERT INTO @TestData (
                          [TestValues]
                      )
VALUES ( N's1 Test Data' )
     , ( N's2 Test Data' )
     , ( N's3 Test Data' )
     , ( N'test data not filtered out' )
     , ( N'test data not filtered out 1' );


SELECT          a.*
FROM            @TestData [a]
LEFT OUTER JOIN @FilterValues [b]
    ON PATINDEX([b].[FilterValue] + '%', [a].[TestValues]) > 0
WHERE           [b].[FilterValue] IS NULL;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...