对IN子句使用选择查询以及硬编码值

时间:2019-04-15 12:40:25

标签: sql sql-server tsql sql-server-2014

我有一些代码,我在其中选择具有以下任何硬编码的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表的动态列表,其中在{{ 1}}到SETID范围。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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