`
尘枉_yjava
  • 浏览: 73901 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

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' 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

分享到:
评论

相关推荐

    SQLServer逗号分隔的字符串转换成表

    SQL Server 逗号分隔的字符串转换成表是指将一个逗号分隔的字符串转换成一个表结构,以便于进行查询、更新或者删除等操作。下面是将逗号分隔的字符串转换成表的步骤: 1. 创建一个临时表:首先,需要创建一个临时表...

    SQL 将以逗号分隔符的字符串转换为 table 列的函数

    将带分隔符的字符串 例如 '1,2,3,4,5,6,7,8,9,10' 转换成table 的列的函数

    一列保存多个ID(将多个用逗号隔开的ID转换成用逗号隔开的名称)

    在数据库设计中,有时会遇到一种情况,即在主表中的一列用来存储多个关联ID,这些ID之间用逗号隔开,这种做法虽然不符合数据库的第一范式,但在某些场景下却被广泛采用。例如,员工可能属于多个部门,每个员工的记录...

    mybatis Mapper.xml中传参多选 字符串形式逗号分隔 AND中拼接OR.rar

    在处理字符串形式的多选参数时,我们通常会先在服务层将这些参数转换为Java集合,如List或Set。例如,如果用户选择的标签以逗号分隔的字符串"tag1,tag2,tag3"传入,我们可以在Java代码中将其分割并存入List。 接...

    oracle将以逗号分隔字符串转多行

    在Oracle数据库中,将逗号分隔的字符串转换为多行是常见的数据处理需求,尤其在需要对每个分隔项进行单独操作时。这个过程通常涉及到字符串处理函数,如`REGEXP_SUBSTR`和`REPLACE`,以及层次查询结构`CONNECT BY`。...

    listtosql 是一个简单的 Visual Studio Code 扩展,用来将一组字符串列表转成以逗号分隔的表达方式

    `listtosql` 是一款专为 Visual Studio Code(VSCode)用户设计的高效扩展,它的主要功能是帮助开发者将一组字符串列表快速转换成 SQL 语句中常用的逗号分隔值(CSV)格式。这个扩展尤其适用于那些需要频繁处理大量...

    SQLServer中求两个字符串的交集

    这样,原本的字符串就被转换成了两个JavaScript数组`a`和`b`。 接下来,定义了一个循环来遍历这两个数组,检查它们是否有相同的元素。如果找到相同的元素并且这个元素尚未添加到结果字符串`c`中,那么就将其添加到`...

    将所有符合条件的结果拼接成一列并用逗号隔开的一个sql语句

    在SQL中,有时候我们需要将符合特定条件的数据拼接成一个字符串,每个结果之间用特定的分隔符(如逗号)隔开。这样的需求在处理报告或者数据分析时非常常见。在给定的示例中,它展示了一种利用SQL函数实现这一目标的...

    MySQL将一个字段中以逗号分隔的取出来形成新的字段实现

    在MySQL数据库中,经常遇到需要处理以逗号分隔的字段值的情况,这些字段通常用于存储多值数据,比如在本例中,`related_shop_ids`字段存储了多个商店ID,用逗号分隔。本篇文章将详细讲解如何将这样的字段拆分成多个...

    DB2 SQL 实现行转列,列转行

    DB2 SQL 通过函数(CONCAT/POSSTR/LOCATE)实现行转列,列转行 可以按照标点把多列转换为一行,多行转换为一列

    MySQL中将一列以逗号分隔的值行转列的实现

    前言 有时会遇到没有遵守第一范式设计模式的业务表。即一列中存储了多个属性值...SQL如下: select distinct(substring_index(substring_index(a.col,',',b.help_topic_id+1),',',-1)) from (select group_concat

    sql高级进阶

    - 根据表中的行创建一个分隔列表:将行数据合并为一个逗号分隔的字符串。 - 提取第n个分隔的子串:使用数据库的字符串分割函数。 - 分解IP地址:将IP地址字符串拆分成单独的数字。 - 将分隔数据转换为多值IN列表...

    完整版读写多字符串值.rar

    读取多字符串值时,我们可能需要使用到的函数或方法有`readline()`、`readlines()`(针对文件)或SQL查询(针对数据库)。写入时则有`write()`、`writelines()`等。在处理分隔符连接的字符串时,可能需要用到`split...

    oracle wm_concat 列转行 逗号分隔

    这个函数在处理特定的数据汇总和报告需求时非常有用,尤其是在你需要将某个列的多个值合并成一个字符串时。然而,需要注意的是,WM_CONCAT并不是Oracle官方提供的标准函数,它在Oracle 11g R2版本之后就被标记为不...

    读取txt数据并格式化成sql语句输出

    这里,我们对每个字段值加上单引号,因为它们通常是字符串,并在每个值之间添加逗号。 4. **输出到新的TXT文件**:生成的SQL语句可以写入新的TXT文件中,供后续导入数据库使用。我们可以使用与读取文件相同的方式...

    MySQL 连接字符串函数 CONCAT() CONCAT-WS() GROUP-CONCAT()

    数字参数会被自动转换为等价的二进制字符串,除非使用 `CAST()` 显式将其转换为字符类型。例如: ```sql SELECT CONCAT(CAST(int_col AS CHAR), char_col); ``` 如果任何参数是 `NULL`,`CONCAT()` 返回的结果...

    Linux awk将文件某列按照逗号分隔的例子

    相反,如果你有一个由逗号分隔的列表,比如`1,2,3,4,5`,并且想要将它们合并成单个字符串`12345`,你可以改变输入记录分隔符(Input Record Separator, IRS): ```bash cat temp.txt | awk 'BEGIN{RS=","} {print ...

    SQL常用函数汇总(比较详细)

    SQL 语言中有多种类型的函数,可以按照不同的分类方式来分类,下面将从函数类别、聚合函数、转换函数、加密函数、游标函数、日期和时间函数、数学函数、元数据函数、排名函数、行集函数、安全函数、字符串函数、系统...

    SQL与EXCEL的导入导出

    在这个过程中,需要注意数据类型的一致性,确保Excel中的数值、日期和字符串在SQL中对应正确的数据类型。 其次,从SQL导出数据到Excel同样重要。这通常用于数据分析、报表生成或与非技术团队共享数据。SQL提供`...

    sqlserver 函数大全

    可选参数通常被置于以逗号隔开的参数表的末尾,以便于在函数调用中去除不需要的参数。在 SQL Server 在线图书或者在线帮助系统中,函数的可选参数用方括号表示。 确定性函数由于数据库引擎的内部工作机制,SQL ...

Global site tag (gtag.js) - Google Analytics