使用 select 查询 IN 子句以及硬编码值

Using select query for IN Clause, along with hardcoded values

我有一些代码,我正在 selecting 具有以下任何硬编码 SETID 值的行。这是添加到 SQL 视图中的附加代码的一部分。

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

除了上述硬编码值外,我还想添加另一个更长的 SETID 列表,范围 '90000' and '90999' 包含在 table PS_LOC_GL。我更愿意使用 BETWEEN 运算符,这样我就不必列出该范围内的每个值。我一直无法找到一种方法来 select 两个硬编码值,并一起使用 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 table 的动态列表,其中只有 SETID 值在 '90000''90999' 范围内。

您可以简单地使用 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)
)

你为什么不 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);