Использование запроса выбора для предложения IN вместе с жестко заданными значениями - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть код, в котором я выбираю строки, которые имеют любое из следующих жестко закодированных значений SETID. Это часть дополнительного кода, внедряемого в представление SQL.

SELECT *
FROM TEST_TABLE1 B
WHERE B.SETID IN ('11000', '18000', '41000', '41001')

В дополнение к вышеуказанным жестко закодированным значениям я хотел бы добавить еще один гораздо более длинный список SETID в диапазоне '90000' and '90999', который содержится в таблице PS_LOC_GL. Я бы предпочел использовать оператор BETWEEN, чтобы мне не приходилось перечислять каждое значение в этом диапазоне. Мне не удалось найти метод для выбора обоих жестко закодированных значений и совместного использования оператора BETWEEN.

Это то, что я придумал до сих пор, однако я не верю, что могу использовать переменные внутри представлений SQL, поэтому, хотя это работает как собственный код SQL, оно не будет работать внутри моего представления:

DECLARE @SET_ID_LIST table (SETID varchar(5))
INSERT @SET_ID_LIST(SETID) VALUES ('11000'), ('18000'), ('41000'), ('41001');

SELECT *
FROM TEST_TABLE1 B
WHERE B.SETID IN (
    SELECT SETID FROM @SET_ID_LIST 
    UNION
    SELECT SETID FROM PS_LOC_GL
)

Есть ли у меня другие варианты, в которых я могу использовать как жестко закодированный список значений, так и более динамический список, основанный на таблице PS_LOC_GL, которая имеет только значения SETID в '90000' - '90999' диапазон.

Ответы [ 2 ]

2 голосов
/ 15 апреля 2019

Вы можете просто использовать предложение OR:

SELECT *
FROM TEST_TABLE1 B
WHERE B.SETID IN (SELECT SETID FROM PS_LOC_GL /* WHERE SETID BETWEEN ... */)
OR    B.SETID IN ('11000', '18000', '41000', '41001')

Если вы хотите использовать UNION, тогда используйте предложение (VALUES ...), чтобы добавить жестко закодированный список значений:

SELECT *
FROM TEST_TABLE1 B
WHERE B.SETID IN (
    SELECT SETID FROM PS_LOC_GL /* WHERE SETID BETWEEN ... */
    UNION
    SELECT SETID FROM (VALUES
        ('11000'),
        ('18000'),
        ('41000'),
        ('41001')
    ) AS v(SETID)
)
0 голосов
/ 15 апреля 2019

Почему бы вам просто не OR другое условие? IN на самом деле является ярлыком для нескольких OR с, поэтому просто добавьте его.

SELECT *
       FROM test_table1 b
       WHERE b.setid IN ('11000', '18000', '41000', '41001')
              OR b.setid IN (SELECT setid
                                    FROM ps_loc_gl);

Или с операцией BETWEEN что-то вроде:

SELECT *
       FROM test_table1 b
       WHERE b.setid IN ('11000', '18000', '41000', '41001')
              OR b.setid BETWEEN (SELECT min(setid)
                                  FROM ps_loc_gl)
                                 AND (SELECT max(setid)
                                             FROM ps_loc_gl);
...