如何把用逗号等字符隔开的字符串转换成列表,下面依逗号分隔符为例:

比如有一个字符串,其值为:香港,张家港,北京,上海
用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' text
FROM DUAL)
SELECT regexp_substr (text, '[^,]+', 1, rn) city
FROM temp t1,
(SELECT LEVEL rn
FROM DUAL
CONNECT BY LEVEL <=
(SELECT LENGTH (text)
- LENGTH (REPLACE (text, ',', ''))
+ 1
FROM temp)) t2

3、方法三:使用的表(FW_ANSWER)

select answer from fw_answer

   ANSWER
-----------------
A,B,C
A,F
B,D,E
D

要把逗号分隔的转列换成行显示,这里使用了substr的方式,如下:

 select substr(answer,instr(','||answer|| ',', ',', 1, t2.row_num),
instr(','||answer|| ',', ',', 1, t2.row_num+1)-1-instr(','||answer, ',', 1, t2.row_num)) answer
from fw_answer t1,(select rownum row_num from user_objects where rownum<= 10) t2
where 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
-----------------
A
A
B
B
C
D
D
E
F

【如果是使用其他字符分隔的,以上方式也可以,只需要将有逗号的地方换成该字符。】 
   以上方式是针对字符存储无规律的情况,对于fw_answer表中的答案列是有规律可循的,所以简化后的sql如下:

  select substr(answer,t2.row_num*2-1,1) answer
from fw_answer t1,(select rownum row_num from user_objects where rownum<= 10) t2
where 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 A
1 B
1 C
2 A
2 B
3 C
3 F
4 D
转换后变成:
1 A,B,C
2 A,B
3 C,F
4 D

方法:

假设你的表结构是tb_name(id, remark),则语句如下:
SELECT a.id, wm_concat (a.remark) new_result FROM tb_name a group by a.id
 

使用SQL如何把用逗号等字符隔开的字符串转换成列表(转)的更多相关文章

  1. SQL 把表中字段存储的逗号隔开内容转换成列表形式

    原文:[原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式 我们日常开发中,不管是表设计问题抑或是其他什么原因,或多或少都会遇到一张表中有一个字段存储的内容是用逗号隔开的列表. 具体效果如下图: ...

  2. [转]字符型IP地址转换成数字IP的SQL函数

    使用SQL函数可以实现许多的功能,下面为您介绍的是字符型IP地址转换成数字IP的SQL函数示例,供您参考,希望对您学习SQL函数能够有所帮助.      /**//*--调用示例       sele ...

  3. sql 处理以字符隔开的字符串(类似split)

    sql 处理以字符隔开的字符串(类似split)的处理方法. CREATE PROCEDURE dbo.Vip_SendMails @userids varchar(MAX), ), ), @c va ...

  4. Sql Server 中将由逗号“,”分割的一个字符串转换为一个表集,并应用到 in 条件中

    Sql Server 中将由逗号“,”分割的一个字符串,转换为一个表,并应用与 in 条件 ,,) 这样的语句和常用,但是如果in 后面的 1,2,3是变量怎么办呢,一般会用字符串连接的方式构造sql ...

  5. [原创]SQL表值函数:把用逗号分隔的字符串转换成表格数据

      我们日常开发过程中,非常常见的一种需求,把某一个用逗号或者/或者其他符号作为间隔的字符串分隔成一张表数据. 在前面我们介绍了 [原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式,当然按照这 ...

  6. JS 将对象转换成字符 字符串转换成json对象

    //js对象 var user = { "name": "张学友", "address": "中国香港" }; //将对 ...

  7. [原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式

    我们日常开发中,不管是表设计问题抑或是其他什么原因,或多或少都会遇到一张表中有一个字段存储的内容是用逗号隔开的列表. 具体效果如下图: ------> 从左边图转换成右边图,像这种需求,我们难免 ...

  8. 100怎么变成100.00 || undefined在数字环境下是:NaN || null在数字环境下是0 || 数组的toString()方法把每个元素变成字符串,拼在一起以逗号隔开 || 空数组转换成字符串后是什么?

    100怎么变成100.00?

  9. 使用SQL SERVER FOR XML PATH将多个结果集转换成一行并进行去重处理

    在一个医药行业的系统中需要根据患者的接触记录ID获取不同接触类型的集合,效果像这样     --患者接触记录信息,一个患者可以有N个不同的接触记录,每个接触记录又有N个接触类型记录 IF OBJECT ...

随机推荐

  1. Android NDK环境搭建及调用JNI的简单步骤

    转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3396595.html Java Native Interface (JNI)标准是java平台的一部分 ...

  2. 《The Linux Command Line》 读书笔记01 基本命令介绍

    <The Linux Command Line> 读书笔记01 基本命令介绍 1. What is the Shell? The Shell is a program that takes ...

  3. 如何自定义ViewGroup

    依照惯例,先从一个例子说起. 很简单,3张扑克牌叠在一起显示.这个布局效果该如何实现呢?有的同学该说了,这很简单啊,用RelativeLayout或FrameLayout,然后为每一个扑克牌设置mar ...

  4. Android Studio 2.2新功能预览

    升级SDK可用Background 多加了个按钮,可用一边写代码一边下载SDK Instant Run 修改代码一秒启动 APK analyzer 分析任何的APK 查看APK下载包的大小,解压后的实 ...

  5. CRM项目经验总结-从DAO层到链接数据池

    IDAO接口 定义项目中所有板块相似功能 也是整个项目的根接口  public interface IDAO {  /**   * 新增数据 @param SQL sql查询语句  @param pa ...

  6. samba服务配置

    使用yum或者apt-get安装 # yum install samba samba-client samba-swat Samba开发环境配置 Acl权限设置  [不是必须.只要保证web目录的所有 ...

  7. tar包在linux下 java安装

    总的原则:将jdk-7u10-linux-x64.tar.gz压缩包解压至/usr/lib/jdk,设置jdk环境变量并将其修改为系统默认的jdk 1.将jdk-7u5-linux-x64.tar.g ...

  8. 【转发】NPAPI开发详解,Windows版

    NPAPI开发详解,Windows版 9 jiaofeng601, +479 9人支持,来自Meteor.猪爪.hanyuxinting更多 .是非黑白 .Yuan Xulei.hyolin.Andy ...

  9. Qt使用自带的windeployqt 生成exe来发布软件

    集成开发环境 QtCreator 目前生成图形界面程序 exe 大致可以分为两类:Qt Widgets Application  和 Qt Quick Application.下面分别介绍这两类exe ...

  10. 利用网络流传的WebShell默认密码库寻找WebShell

    声明:本文提到的技术,仅可用作网络安全加固等合法正当目的.本文作者无法鉴别判断读者阅读本文的真实目的,敬请读者在本国法律所允许范围内阅读本文,读者一旦因非法使用本文提到技术而违反国家相关的法律法规,所 ...