返回值的查询索引

时间:2018-07-16 08:28:43

标签: sql union

我有一个简单的架构,例如简单的

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”。我想知道是否可以完全不干扰我的查询。

3 个答案:

答案 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