使用SQL如何把用逗号等字符隔开的字符串转换成列表,以及把列合并成符合隔开的字符串(转)...
如何把用逗号等字符隔开的字符串转换成列表,下面依逗号分隔符为例:
比如有一个字符串,其值为:香港,张家港,北京,上海
用SQL把这个字符串转换成列表的方法是:
1、方法一
WITH A AS (SELECT '香港,张家港,北京,上海' A FROM DUAL) SELECT DECODE(B,0,SUBSTR(A,C),SUBSTR(A,C,B-C)) city FROM ( SELECT A,B,(LAG(B,1,0) OVER(ORDER BY LV))+1 C FROM( SELECT A,INSTR(A,',',1,LEVEL) B,LEVEL LV FROM A CONNECT BY LEVEL <=(LENGTH(A) - LENGTH(REPLACE(A,',','')))+1 ) )
输出结果是:
香港 张家港 北京 上海
应用举例:
如果table1表的city字段的值为:北京;table2表的city字段的值为:香港,张家港,北京,上海
要想用city字段关联table1,table2表来查询table1表中的数据,首先我们会想到用(例:select * from table1 where field in (select field from table2))方式来查询,但是这样查询的结果却不正确,仔细观察会发现如果用in时,table2表的city字段的值必须得是('香港','张家港','北京','上海')格式,这样查询的结果才会正确,这时如果我们使用下面的SQL就可帮我们解决这个问题了。
例:select * from table where field in ( WITH A AS (SELECT (select field from table2) A FROM DUAL) SELECT DECODE(B,0,SUBSTR(A,C),SUBSTR(A,C,B-C)) city FROM (SELECT A,B,(LAG(B,1,0) OVER(ORDER BY LV))+1 C FROM(SELECT A,INSTR(A,',',1,LEVEL) B,LEVEL LV FROM A CONNECT BY LEVEL <=(LENGTH(A) - LENGTH(REPLACE(A,',','')))+1 )))
2、方法二:使用Oracle regexp_substr中的正则表达式
WITH temp AS(SELECT '香港,张家港,北京,上海,95,aa' textFROM DUAL) SELECT regexp_substr (text, '[^,]+', 1, rn) cityFROM temp t1,(SELECT LEVEL rnFROM DUALCONNECT BY LEVEL <=(SELECT LENGTH (text)- LENGTH (REPLACE (text, ',', ''))+ 1FROM temp)) t2
3、方法三:使用的表(FW_ANSWER)
select answer from fw_answerANSWER----------------- A,B,CA,FB,D,ED
要把逗号分隔的转列换成行显示,这里使用了substr的方式,如下:
select substr(answer,instr(','||answer|| ',', ',', 1, t2.row_num),instr(','||answer|| ',', ',', 1, t2.row_num+1)-1-instr(','||answer, ',', 1, t2.row_num)) answerfrom fw_answer t1,(select rownum row_num from user_objects where rownum<= 10) t2where nvl(substr(answer,instr(','||answer||',', ',', 1, t2.row_num),instr(','||answer||',', ',', 1, t2.row_num+1)-1-instr(','||answer, ',', 1, t2.row_num)),'-')!='-'order by answer
查询结果:
ANSWER----------------- AABBCDDEF
【如果是使用其他字符分隔的,以上方式也可以,只需要将有逗号的地方换成该字符。】
以上方式是针对字符存储无规律的情况,对于fw_answer表中的答案列是有规律可循的,所以简化后的sql如下:
select substr(answer,t2.row_num*2-1,1) answerfrom fw_answer t1,(select rownum row_num from user_objects where rownum<= 10) t2where nvl(substr(answer,t2.row_num*2-1,1),'-')!='-'order by answer
【注:user_objects主要描述当前用户通过DDL建立的所有对象。包括表、视图、索引、存储过程、触发器、
包、索引、序列等。是oracle字典表的视图。这里也可以通过其它方式,如dual,此处为了免去content by
所以不用dual,用user_objects。】
------------------------------------------------------------------------------------------------------
正好相反的操作:把列转换成行
从网上找了都是关于decode的方法实现的列转行,后来发现了用orcale的wmsys.wm_concat方法可以轻松的实现,下面的范例是网上找的:wmsys.wm_concat要10g以后才可以。
表结构: 1 A1 B1 C2 A2 B3 C3 F4 D转换后变成: 1 A,B,C2 A,B3 C,F4 D
方法:
假设你的表结构是tb_name(id, remark),则语句如下:
SELECT a.id, wm_concat (a.remark) new_result FROM tb_name a group by a.id
使用SQL如何把用逗号等字符隔开的字符串转换成列表,以及把列合并成符合隔开的字符串(转)...相关推荐
- 【SQL开发实战技巧】系列(九):一个update误把其他列数据更新成空了?Merge改写update!给你五种删除重复数据的写法!
系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...
- EXCEL之将某列合并成一行并用逗号隔开
今天在准备数据的时候因为写XML文件中的字段值比较麻烦,所以先把需要的字段值从数据库导出到excel中,并合并成一行,用逗号隔开,然后直接粘贴到XML文件中. 将下图中字段名对应的字段值代换为数据库中 ...
- SQL 把表中字段存储的逗号隔开内容转换成列表形式
原文:[原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式 我们日常开发中,不管是表设计问题抑或是其他什么原因,或多或少都会遇到一张表中有一个字段存储的内容是用逗号隔开的列表. 具体效果如下图: ...
- 如何将SQL查询出的两列合并成一列显示,并用逗号隔开
如何将SQL查询出的两列合并成一列显示,并用逗号隔开 先给出一个表 DROP TABLE IF EXISTS `apps`; CREATE TABLE `apps` (`id` int NOT NUL ...
- 【SQL】正则表达式-校验数字,字符,特殊需求等
一.校验数字的表达式 1 数字:^[0-9]*$ 2 n位的数字:^\d{n}$ 3 至少n位的数字:^\d{n,}$ 4 m-n位的数字:^\d{m,n}$ 5 零和非零开头的数字:^(0| ...
- 关于SQL注入,绕过逗号过滤
关于SQL注入,绕过逗号过滤 前言 题目 测试 解题 1.union联合注入 2.盲注 总结 前言 最近在i春秋遇到一道sqli题目,觉得很有意思,总结一下与大家分享. "百度杯" ...
- SQL中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型
简要描述一下SQL中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型 字符型 VARCHAR VS CHAR VARCHAR型和CHAR型数据的这个差别是细微的,但是非常重要.他们都是用来储存字 ...
- sql server 中将由逗号“,”分割的一个字符串,转换为一个表,并应用与 in 条件...
select * from tablenmae where id in(1,2,3) 这样的语句和常用,但是如果in 后面的 1,2,3是变量怎么办呢,一般会用字符串连接的方式构造sql语句 stri ...
- 各数据库SQL查询结果多行数据合并成一行
SQL查询结果多行数据合并成一行 一.Oracle函数多行数据合并成一行 二.Mysql函数多行数据合并成一行 三.sqlserver函数多行数据合并成一行 四.postgresql函数多行数据合并成 ...
最新文章
- matlab 报错 javax,[求助]安装报错,求大佬帮忙
- arduinows2812灯条程序_Arduino 控制WS2812 LED灯条
- 合并两个有序数组—leetcode88
- SDK目录结构和adb工具及命令介绍
- 《大话设计模式》 国外资料
- seaborn.heatmap概述
- 前端学习(1858)vue之电商管理系统电商系统之分析登录页面的布局结构
- Standard Driver Routines(标准驱动程序)
- python时间格式转换time模块
- CyclicBarrier底层实现和原理
- java事件 socket_java中有关socket通信的学习笔记
- dell服务器t330进入不了系统,Re: 戴尔T330服务器故障
- 关于叫号类的PV操作总结
- 联想Y720,win10下安装双系统Ubuntu过程遇到的一些问题及解决方法
- php smarty fetch,fetch - [ smarty完全中文手册 ] - 在线原生手册 - php中文网
- yum安装vsftpd时提示:另外一个程序锁定了 yum
- 感谢周易算命大师元真先生
- Linux服务器安装mysql
- 业务安全情报第四期:新能源车企重金打造的私域流量,成为黑灰产“掘金发财”的新目标
- windows 7 旗舰版 失效key
热门文章
- java adt怎么打开项目,如何在Eclipse中打开Android Studio项目?
- ptp driver Linux doc
- 数学建模题目及论文_三道适合作为试题的数学建模题目及其评分标准
- 专升本c语言程序设计网课_2020年宜春学院专升本招生信息
- csgo如何保存自己的cfg_KXCSGO:CSGO开箱饰品交易方法
- springmuvc如何设置jsp的input跳转_如何扩大私域流量?「上线了」跳转小程序来帮你...
- Dijkstra的算法
- 路过的朋友们,最后一天投票,感谢
- Docker - Tips
- ubuntu 用命令行设置chrome的proxy