求sql : 如何把in 里面的(‘123,456,789’)变成它能识别的类型(‘123’,‘456’,‘789’)?

kelvin357 2011-04-10 11:39:38
参数var_id 实际上是传进来的string ,
var_id :='123,456,789' ;

select id, name from test_tbl where id in (var_id)
如何把in 里面的(‘123,456,789’)变成它能识别的类型(‘123’,‘456’,‘789’)?
...全文
279 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
minitoy 2011-04-11
  • 打赏
  • 举报
回复
恩,2楼的replace+7楼的open cursor
kelvin357 2011-04-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bobo12082119 的回复:]

SQL code

--id为字符类型
select id,name
from test_tb1
where id in(
substr(string,1,3),
substr(string,5,3),
substr(string,9,3));
--id为数字(number)类型
select id,name
from test_tb1
where id i……
[/Quote]
谢谢你的思路 , 但是我的实际情况是, 这个 ID 的字符串很长, 有分解后有100个的时候,我是不是得写100个substr呢?并且还是得 1,5,9,13.。。。这样写下去啊。。不写写得累, 如果再多一点,效率估计也不怎么高啊
kelvin357 2011-04-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 upc05070000 的回复:]

declare
var_id varchar2(100) := '123,456,789';
begin
select '''' || replace(var_id, ',', ''',''') || ''''
into var_id
from dual;
dbms_output.put_line(var_id);
end;
--结果是'123','4……
[/Quote]
谢谢你的答案,呵呵, 我之前也是这样做的, 结果把它放在sql里面,那个in 就变成了 in ("'123','456','789' ") ,它始终还是一个字符串的,结果是一条记录都没有查出来呢。。。
UPC子夜 2011-04-10
  • 打赏
  • 举报
回复
declare
var_id varchar2(100) := '123,456,789';
begin
select '''' || replace(var_id, ',', ''',''') || ''''
into var_id
from dual;
dbms_output.put_line(var_id);
end;
--结果是'123','456','789'
304的的哥 2011-04-10
  • 打赏
  • 举报
回复

--id为字符类型
select id,name
from test_tb1
where id in(
substr(string,1,3),
substr(string,5,3),
substr(string,9,3));
--id为数字(number)类型
select id,name
from test_tb1
where id in(
to_number(substr(string,1,3)),
to_number(substr(string,5,3)),
to_number(substr(string,9,3)));
UPC子夜 2011-04-10
  • 打赏
  • 举报
回复
上边的方式有点小问题 就是 会把123 12 23这样的数据都查出来
换成 select * from mw_app.mwt_gradeinfo g
where instr((select '''' || replace('123,456', ',', ''',''') || '''' as newsubjects
from dual),
'''' || g.subject || '''',
1,
1) > 0;
这样就好了 匹配的时候 前后各加一个引号 就把12 23这种模糊匹配的数据过滤掉了
UPC子夜 2011-04-10
  • 打赏
  • 举报
回复
知道了 这种问题我也遇到过
你换成instr试试
例子:
select *
from mw_app.mwt_gradeinfo g
where instr((select '''' || replace('123,456,789', ',', ''',''') || ''''

from dual),
g.stuname,
1,
1) > 0
luoyoumou 2011-04-10
  • 打赏
  • 举报
回复
-- 用 存储过程 + 动态SQL 可以解决!请看:

http://topic.csdn.net/u/20110331/10/35ae9f81-e437-48ac-8de3-4bc4af1b66e0.html
kelvin357 2011-04-10
  • 打赏
  • 举报
回复
不不不,我只是想告诉你, 那个双引号代表着, 我传进去的那个变量var_id 是一个我定义的varchar2 类型嘛, 我in (var_id)里面的 就算你变成了'123','456','789' , 它也只是识别你传进来的是一个字符串, 而不是 id in (var1,var2,var3) 这种格式。。。
UPC子夜 2011-04-10
  • 打赏
  • 举报
回复
最外边那一层双引号怎么出来的?传进来的?还是你后来拼进去的?
replace掉不行吗?
把你的完整sql贴出来我看看

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧