使用 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);
我有一些代码,我正在 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);