oracle10g中对varchar2类型的字段怎么做出类似split的功能(急)

huangan0301 2009-04-20 09:45:10
oracle10g中得到一个varchar2类型字段的值为'a,b,c',怎么得到一个{a,b,c}的集合,a,b,c分别也为varchar2,让我能进行select...form...where ... in
('a','b','c')操作,操作只能在oracle中,','的数量不只2个,是动态的
...全文
155 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
GeekZFZ 2009-04-23
  • 打赏
  • 举报
回复
学习
chenqingyu 2009-04-21
  • 打赏
  • 举报
回复
少加了对引号
instr( ','||value||','  ,  ','||'a,ab,abc,abcd'||',' )>0


chenqingyu 2009-04-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 huangan0301 的帖子:]
oracle10g中得到一个varchar2类型字段的值为'a,b,c',怎么得到一个{a,b,c}的集合,a,b,c分别也为varchar2,让我能进行select...form...where ... in
('a','b','c')操作,操作只能在oracle中,','的数量不只2个,是动态的
[/Quote]

完全没必要....oracle有instr函数...

你的in可以改写成instr,比如你要找value字段在不在'a,b,c,d'里,用 instr(value,'a,b,c,d')>0就行了...

进一步,如果是'a,ab,abc,abcd'这种串,也就是说串内部的值是有包含关系的,
可以用instr( ','||value||',' , ','||a,ab,abc,abcd||',' )>0
LJY_AINILU 2009-04-21
  • 打赏
  • 举报
回复
二楼的是正解,这个以前我自己也写过,是用数组结合着去做的 很容易的
bw555 2009-04-21
  • 打赏
  • 举报
回复
或者用dbms_sql执行动态语句,这样就不需要拆分了
bw555 2009-04-21
  • 打赏
  • 举报
回复
感觉还是到开发工具中去处理吧,比如.net直接就有split函数
hanks_gao 2009-04-21
  • 打赏
  • 举报
回复
是要自己寫的,樓主可以參考2樓的.
oraclelogan 2009-04-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 huangan0301 的帖子:]
oracle10g中得到一个varchar2类型字段的值为'a,b,c',怎么得到一个{a,b,c}的集合,a,b,c分别也为varchar2,让我能进行select...form...where ... in
('a','b','c')操作,操作只能在oracle中,','的数量不只2个,是动态的
[/Quote]

个人感觉sql中只能用 instr来做了,否则的话,你就只有用前台java代码来实现了!
Andy__Huang 2009-04-21
  • 打赏
  • 举报
回复
用函数instr()
判断它里面是否存在值?如果存在值那么instr(','||'a,b,c'||',',字段)>0
rockywu 2009-04-20
  • 打赏
  • 举报
回复
好像没有这个功能split功能哦
参考:http://hi.baidu.com/wenwenxiaoxing/blog/item/419cd6ca91b01e43f21fe794.html
ks_reny 2009-04-20
  • 打赏
  • 举报
回复
关注。
自己写的数据库装载工具,平时工作用于装载大文本文件到数据库表,也能直接装载excel,不过excel只能使用第一个sheet,且不支持合并的单元格。 jdk要求版本1.6及以上。 使用方法: java -jar lynload.jar,即可看到文命令行参数(unix下需设置gbk字符集环境才能看文,没gbk环境不能看文,但不影响导入数据)。 特色: 1.同时支持多个数据库. 2.支持任意字符串作为列分隔符,什么竖线逗号或者十六进制字符及任意组合字符串都行 3.支持任意字符串作为每行分隔符,例如\r,\r\n,或者十六进制字符或任意指定的字符串(例如可实现把整个日志文件装入数据库的单个clob字段). 4.支持任意大小的文本,装入几十GB都试过没问题。 5.明确到每一行的错误信息.(装载时会生成一个.err文件,里面有装载出错的每一行错误原因(少字段还是格式不符合要求等等)。 6.可以作为库使用在jsp等后台直接调用,将整个jar作为库,使用 OraLoad类的int ProcLoad(Connection in_conn, String args[])函数就可以实现类似功能了。例如 new OraLoad.ProcLoad( null, "-u test -p testpwd -i 127.0.0.1 -s ora10 -f test.txt -t tmp_test -c , -e gbk"); 具体参数如下: Usage: -db database type 1或者oracle, oracle数据库,不区分大小写,默认1,需java1.5及以上版本 2或者sqlserver, mssqlserver数据库,不区分大小写,需java1.6及以上版本 3或者mysql, mysql数据库,不区分大小写,需java1.5及以上版本 4或者sybase, sybase数据库,不区分大小写(暂未测试) -url 数据库连接的url.默认空字符串 如果有url参数,则-i-p-s-dn参数全无效。 如果没有url参数,则必须提供-i-p-s参数,程序里面好拼凑url 例如: jdbc:sqlserver://localhost:1433; DatabaseName=sample -i ip address:port ip地址和端口,间用冒号隔开 url不为空则此参数无效 如果不带端口,系统根据数据库类型采用默认端口 oracle数据库: 默认为1521端口 sqlserver数据库: 默认为1433端口 mysql数据库: 默认为3306端口 sybase数据库: 默认为5000端口 例如: 127.0.0.1:1521 例如: 192.168.0.1 -s serviceid or database name oracle服务名或者其他数据库的数据库名 url不为空则此参数无效 -u username 用户名,必输 -p Password 登录密码,必输 -t TableName 要插入的表名,可以带用户,必输 例如: scott.emp 或者 emp都行 -f FileName 来源的文件名,必输 -ff FileName format 来源的文件名类型:txt,文本文件;xls:Excel2003或2007文件),默认是txt 对于Excel文件的导入,仅导入第一个sheet的内容,其他sheet的内容忽略 -e Encoding 文件的编码,默认gbk -c Cut split string 分隔字符串,可以是多个字符组合,默认竖线 -r commit rows 每插入多少行提交一次,-1表示不提交,默认-1,如果设置了ac参数为1,则此参数无效。 注意:如果设置了此参数,每到此行数会执行一次commit,如果是外部调用此过程要注意所有数据会被提交 -ac all commit 0.插入成功的都提交,失败的登记文本,默认0; 1.全部插入成功后才提交(有失败则回滚并结束) -a column flag 第一行的类型 0.没有列名行,默认0。此值为0则it参数不生效。 1.第一行是逗号分隔的包括列类型的列信息,例如NAME VARCHAR2(30),注意,区分大小写 2.第一行是列分隔符分隔的列名(不包括列字段信息),注意,列名区分大小写 -it insert type 1.导入的列需要跟数据库列名个数及名称完全相同,顺序无所谓,默认1 2.仅导入文件字段名与数据库字段名完全相同的数据,顺序无所谓 3.第一行是列信息,按此列信息创建新表导入数据(暂不用) 4.忽略第一行,无论第一行是什么数据全部忽略,从第二行按列字段顺序匹配装载 必须在-a 参数 > 0时才生效,否则无意义 -d date formate 日期格式,参考java的SimpleDateFormate类参数,默认自动识别 可识别格式:yyyyMMdd, yyyy-MM-dd, yyyy/MM/dd, yyyyMMdd:HHmmss(等于oracle的yyyymmdd:hh24miss) yyyy年,MM月,dd日,HH 24小时制时,hh 12小时制时,mm 分, ss秒 -l line end string 每条记录结尾的分隔符,默认是 \r\n回车换行符,支持前面-c参数说的转义符 oracle例子: 登陆scott用户,裝载a.txt的逗号分隔的gbk编码文本内容到scott.emp java -jar xxx.jar -i 127.0.0.1 -p 1521 -s ora10 -u system -p manager -t scott.emp -f a.txt -c , sqlserver例子: 登陆11.8.126.181数据库的test用户,裝载f: est.xlsx的excel数据到tmp_i表 java -jar -db sqlserver -i 11.8.126.181 -s abcd -u test -w test -f f: est.xlsx -t tmp_i -ff xls mysql例子: 登陆本机数据库的root用户,裝载a.txt的文本数据到tmp_i表,不提交 java -jar xxx.jar -db mysql -i 127.0.0.1 -s gjjgj -u root -w root -f a.txt -t tmp_i

17,086

社区成员

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

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