我有一个简单的架构,例如简单的
SELECT * FROM some_table WHERE someparam = 'paramvalue1' UNION
SELECT * FROM some_table WHERE someparam = 'paramvalue2' UNION ...
通过切换someparam值创建查询。当然,我可以使用sql IN运算符更改所有查询,并且它应该以相同的方式工作。但问题是我需要所有查询的编号,这给了我任何结果。因此,如果参数值为“ paramvalue2”和“ paramvalue5”的查询返回了结果,则我需要一些列,例如值[2,5]的“结果”。 最简单的方法是什么?我需要一个可以在PostgreSQL,MSSQL和Oracle上运行的解决方案。
编辑: 我不想弄乱我的架构查询,例如:
SELECT * FROM some_table WHERE someparam = ?
那只是简单的示例,查询可以具有多个参数和JOINS等,我只想研究简单的示例。
我想要得到的结果是查询数,这完全给了我任何结果,我不需要任何值。 @Jasen给出的解决方案几乎可以解决,因为我需要做的唯一更改是将“ SELECT”替换为“ SELECT as results”。我想知道是否可以完全不干扰我的查询。
答案 0 :(得分:2)
我不确定如何在所有这些DB上使用它,但是您可以按照以下方式进行操作
select x.id, some_table.* from
sme_table join
(select 1 as id, 'paramvalue1' as val UNION
select 2, 'paramvalue2' UNION
select 3, 'paramvalue3' UNION
select 4, 'paramvalue4'
...
) x on sme_table.someparam = x.val
您可以在所选的数据库中使用GROUP_CONCAT(x.id)
或等效的结果矢量。
答案 1 :(得分:1)
我会这样:
SELECT 1 AS queryno,* FROM some_table WHERE someparam = 'paramvalue1'
UNION ALL
SELECT 2 AS queryno, * FROM some_table WHERE someparam = 'paramvalue2'
UNION ALL...
上面的OTOH,您只需查看结果中的someparam
的值即可。
我使用UNION ALL
是因为通过添加queryno将会有bo共享行,并且使用UNION ALL
会跳过重复数据删除步骤。
答案 2 :(得分:0)
另一种方法是使用DENSE_RANK()分析函数,该函数应该比多次查询同一张表要有效得多,例如:
WITH some_table AS (SELECT 1 ID, 100 val, 'paramvalue1' someparam FROM dual UNION ALL
SELECT 2 ID, 200 val, 'paramvalue2' someparam FROM dual UNION ALL
SELECT 3 ID, 300 val, 'paramvalue3' someparam FROM dual UNION ALL
SELECT 4 ID, 400 val, 'paramvalue1' someparam FROM dual UNION ALL
SELECT 5 ID, 500 val, 'paramvalue2' someparam FROM dual UNION ALL
SELECT 6 ID, 600 val, 'paramvalue6' someparam FROM dual UNION ALL
SELECT 7 ID, 700 val, 'paramvalue5' someparam FROM dual UNION ALL
SELECT 8 ID, 800 val, 'paramvalue2' someparam FROM dual UNION ALL
SELECT 9 ID, 900 val, 'paramvalue3' someparam FROM dual UNION ALL
SELECT 10 ID, 1000 val, 'paramvalue1' someparam FROM dual)
SELECT dense_rank() OVER (ORDER BY someparam) results,
st.*
FROM some_table st
WHERE someparam IN ('paramvalue1', 'paramvalue2', 'paramvalue3', 'paramvalue4', 'paramvalue5')
ORDER BY 1;
RESULTS ID VAL SOMEPARAM
---------- ---------- ---------- -----------
1 4 400 paramvalue1
1 1 100 paramvalue1
1 10 1000 paramvalue1
2 2 200 paramvalue2
2 5 500 paramvalue2
2 8 800 paramvalue2
3 9 900 paramvalue3
3 3 300 paramvalue3
4 7 700 paramvalue5