问题如下:某表的一个字段,数据形如“001|002|003|”,001等是store_code;
该字段可以通过pl/sql取出并赋值给变量,假设变量名为v_store_str;现在需要查询,用上面的变量作为where的限制。
我的做法如下,不成功
select * from dim_store ds where ds.store_code in (select ''''||replace(SUBSTR(v_store_str,1,length(v_store_str)-1) ,'|',''',''')||'''' store_code from dual);请高手指点,
谢谢!
该字段可以通过pl/sql取出并赋值给变量,假设变量名为v_store_str;现在需要查询,用上面的变量作为where的限制。
我的做法如下,不成功
select * from dim_store ds where ds.store_code in (select ''''||replace(SUBSTR(v_store_str,1,length(v_store_str)-1) ,'|',''',''')||'''' store_code from dual);请高手指点,
谢谢!
select * from dim_store ds where ds.store_code in
(select ''''||replace(SUBSTR(v_store_str,1,length(v_store_str)-1) ,'|',''')||'''' store_code from dual);
SELECT ''''||replace(SUBSTR('001|002|003|',1,length('001|002|003|')-1) ,'|',''',''')||'''' dd FROM DUAL
的查询结果是: '001','002','003'
--001|002|003|”, 变成001,002,003这样?select * from dim_store ds
where ds.store_code in (select ''''||replace(SUBSTR(v_store_str,1,length(v_store_str)-1) ,'|',',')||'''' store_code from dual);
--楼主我的测试数据 001|002|003 均为数值类型!所以有string+0的actionselect * from dim_store ds where ds.store_code in (
select b.* from
(
select substr(test,1,instr(test,'|',1)-1)+0 from tt_name
union
select substr(test,instr(test,'|',2)+1,1)+0 from tt_name
union
select substr(test,instr(test,'|',3)+1,1)+0 from tt_name)b )
会提示找不到数据~~~~
问题在where处,不知道怎么弄,&&
可能是俺表述不清,
简单说是这样,select ds.store_code from dim_store ds where ds.store_code in ('001','002','003');
是可以正确的;
现在需要把'001','002','003'地方用变量来传递进来,
因为'001','002','003' 在别的表的别的字段里以001|002|003的形式存放。
SQL> select ''''||replace('001|002|003','|',''',''')||'''' from dual;
''''||REPLACE('001|002|003','|
------------------------------
'001','002','003'
SQL>
这样?
最好在程序里面拼接SQL语句
--明白你的意思。
原来的做法就是在PHP中用字符串连接,是可以是实现的。
现在准备全部用PL/SQL写,所以遇到这个问题。
只不过,现在的001|002|003通过变量传递进来,放在where里就不行了。
我再看看,有没有其他的解决方法。
谢谢大家!
其实是oracle 存储过程 sql中in调用动态变量的问题http://zhidao.baidu.com/question/145940726.html?push=qlhttp://www.mscto.com/Javatec/301028205.html
思路如下,
declare
v_store_str_2 varchar2(2000);
v_result number(3);
begin
select tt.t into v_store_str_2
from (select '''' || replace(SUBSTR(v_store_str,1,length(v_store_str) - 1),
'|', ''',''') || '''' t from dual) tt; execute immediate 'select sum(fsi.qty) sum_sold_qty
from fact_sales_item fsi, dim_invn_item dii, dim_store ds
where fsi.item_sid = dii.item_sid and ds.store_no = fsi.store_no
and ds.store_code in (' ||v_store_str_2 || ') and dii.upc = 2210003861074
and fsi.qty > 0'
into v_result;
declare
v_store_str_2 varchar2(2000);
v_result number(3);
begin
select tt.t into v_store_str_2
from (select '''' || replace(SUBSTR(v_store_str,1,length(v_store_str) - 1),
'|', ''',''') || '''' t from dual) tt; execute immediate 'select sum(fsi.qty) sum_sold_qty
from fact_sales_item fsi, dim_invn_item dii, dim_store ds
where fsi.item_sid = dii.item_sid and ds.store_no = fsi.store_no
and ds.store_code in (' ||v_store_str_2 || ')
and dii.upc = 2210003861074 and fsi.qty > 0'
into v_result;end;
v_store_str 的值是查询出来的,针对每个upc不同,例如是“001|002|085|090|”,或者“001|002|003|004|006|007|008|009|010|011|012|013|014|015|016|017|018|019|020|021|022|025|026|027|028|029|030|031|032|033|034|035|036|037|038|039|040|041|042|043|044|045|046|047|048|049|050|051|052|053|056|057|058|059|060|061|062|063|064|066|068|069|073|074|075|076|077|078|079|080|081|082|083|084|085|086|087|088|090|091|092|095|”的store_code组合,是通过PHP写进来的