如何解决使用 sql 函数避免在具有不同参数值的同一查询之间进行联合
我有一个这样的查询:
select VALUE from REVENUES WHERE categoryId == :x
现在,我使用更多值执行更多次此查询并将所有与 union all 合并
select categoryId,VALUE from REVENUES WHERE categoryId == 10
union all
select categoryId,VALUE from REVENUES WHERE categoryId == 100
union all
select categoryId,VALUE from REVENUES WHERE categoryId == 1000
是否可以定义一个接收 categoryId 作为参数并启动查询的函数?
function myQuery (categoryId ) {
select categoryId,VALUE from REVENUES WHERE categoryId == :x
}
myQuery(10)
union all
myQuery(100)
union all
myQuery(1000)
是否可以执行这样的脚本,而无需重新格式化查询:
select categoryId,VALUE from REVENUES
WHERE categoryId == :x or categoryId == :y or categoryId == :z
解决方法
像这样使用 IN 谓词:
SELECT categoryId,value
FROM revenues
WHERE categoryId IN (10,100,1000);
如果您不知道如何在运行时准备值,您可以像这样对它们进行非规范化:
CREATE OR REPLACE TABLE validCategories (
categoryId INT NOT NULL,PRIMARY KEY(categoryId)
);
SELECT categoryId,value
FROM revenues
WHERE categoryId IN ((SELECT * FROM validCategories));
,
如果您没有动态构造查询的能力,并且您需要使用一些参数作为整数值的字符串,那么我建议您创建一个通用的“tokenizer”函数,如下所示:
CREATE FUNCTION TOKENIZER (P_STR VARCHAR(100))
RETURNS TABLE (TOK INT)
RETURN
SELECT V.TOK
FROM XMLTABLE
(
'$doc/d/i'
PASSING XMLPARSE(DOCUMENT '<d><i>' || replace(P_STR,','</i><i>') || '</i></d>') as "doc"
COLUMNS
TOK INT PATH '.'
) V;
您可以将此函数用于不同的值列表:
SELECT * FROM TABLE(TOKENIZER('10,100')) T;
SELECT * FROM TABLE(TOKENIZER('10,1000')) T;
每次这样的调用都会返回一个包含 1 个 INT 列和相应行数的表。
您可以按如下方式使用它:
select R.categoryId,R.VALUE
from REVENUES R
JOIN TABLE(TOKENIZER('10,1000')) T ON T.TOK = R.categoryId;
您可以使用参数标记代替字符串常量 '10,1000'。
,当查询具有可变数量的值可供选择时,我使用 global temporary table
。使用值列表加载临时表。然后使用 in
子句选择 where
列是 in
临时表。
declare global temporary table custCodeList (
custcode char(6)) with replace
insert into qtemp/custcodelist ( custCode )
values('GLLL01')
insert into qtemp/custcodelist ( custCode )
values('BOFA01')
select a.orhshpnam,a.orhdate,a.orhshpdate
from dwhpf30c a
where a.orhcust in ( select b.custcode
from qtemp/custCodeList b )
这与根据文字值列表进行选择相同:
select a.orhshpnam,a.orhshpdate
from dwhpf30c a
where a.orhcust in ( 'GLLL01','BOFA01')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。