我有超过1000行的sql查询,在每隔几行我需要改变的一年。所以,我想如果有一种方法来设置一个年在sql查询的开始,我可以改变只有一次,而不是通过整个代码进行更改。我试图建立一个sql查询,我可以像这样分配一个变量。
a in (2022,2023) select * from transaction_table where Year_col in a
我知道它可以在t-sql中完成,但不确定Oracle SQL。非常感谢您的帮助。
oyxsuwqo1#
一个选项是将变量的内容拆分到行中。
SQL> var a varchar2(30) SQL> exec :a := '10, 20' PL/SQL procedure successfully completed. SQL> select empno, ename, job, sal 2 from emp 3 where deptno in (select regexp_substr(:a, '[^,]+', 1, level) 4 from dual 5 connect by level <= regexp_count(:a, ',') + 1 6 ); EMPNO ENAME JOB SAL ---------- ---------- --------- ---------- 7369 SMITH CLERK 860 7566 JONES MANAGER 3198.13 7782 CLARK MANAGER 2572.5 7788 SCOTT ANALYST 3225 7839 KING PRESIDENT 5250 7876 ADAMS CLERK 1182.5 7902 FORD ANALYST 3225 7934 MILLER CLERK 1365 8 rows selected. SQL>
不是很优雅,但是-它工作。
8hhllhi22#
动态构造IN列表用于绑定通常是一个不好的做法,并且在更高的卷上确实会导致共享池的问题。IN子句的性质是,为了获得游标共享,它需要保持在固定数量的元素上,这削弱了IN的真正用途。将IN限制为静态的,硬编码的值,这些值不会在查询之间改变。相反,您最好使用标量变量,例如:
IN
select * from transaction where year_col = :year
或
select * from transaction where year_col BETWEEN :startyear AND :endyear
jvlzgdj93#
你可以使用一个集合:
CREATE TYPE year_list IS TABLE OF NUMBER(4,0);
然后:
SELECT * FROM transaction WHERE year_col MEMBER OF year_list(2022,2023);
如果你使用的是支持绑定变量的客户端应用程序(例如Java等),那么你可以在客户端应用程序中创建一个数组,并将其作为绑定变量(Java example)传递给集合:
SELECT * FROM transaction WHERE year_col MEMBER OF :your_bind_variable
3条答案
按热度按时间oyxsuwqo1#
一个选项是将变量的内容拆分到行中。
不是很优雅,但是-它工作。
8hhllhi22#
动态构造
IN
列表用于绑定通常是一个不好的做法,并且在更高的卷上确实会导致共享池的问题。IN子句的性质是,为了获得游标共享,它需要保持在固定数量的元素上,这削弱了IN
的真正用途。将IN
限制为静态的,硬编码的值,这些值不会在查询之间改变。相反,您最好使用标量变量,例如:
或
jvlzgdj93#
你可以使用一个集合:
然后:
如果你使用的是支持绑定变量的客户端应用程序(例如Java等),那么你可以在客户端应用程序中创建一个数组,并将其作为绑定变量(Java example)传递给集合: