将在一列的以逗号隔开的列数据转化为行数据显示的函数

<pre name="code" class="sql">这个是字符串分割函数的使用例子
select to_number(strvalue) as Value from table(fn_split('1,2,3',','))
select to_char(strvalue) as Value from table(fn_split('aa,bb,cc',','))

函数:

</pre><pre name="code" class="sql">CREATE OR REPLACE FUNCTION ROOT.fn_split(
  p_str       IN VARCHAR2,
  p_delimiter IN VARCHAR2)
RETURN ty_tbl_str_split IS
  j         INT := 0;
  i         INT := 1;
  -- 被分割的源字符串 的长度.
  len       INT := 0;
  -- 分隔字符串的长度
  len1      INT := 0;
  -- 暂存的中间每一个单元的文本信息.
  str       VARCHAR2(4000);
  -- 预期返回结果.
  str_split ty_tbl_str_split := ty_tbl_str_split();
BEGIN
  -- 被分割的源字符串 的长度.
  len   := LENGTH(p_str);
  -- 分隔字符串的长度.
  len1 := LENGTH(p_delimiter);

  -- 遍历 被分割的源字符串.
  WHILE j < len LOOP
    -- 在被分割的源字符串中, 查询 分隔字符串.
    j := INSTR(p_str, p_delimiter, i);

    IF j = 0 THEN
      -- j=0 意味着没有找到.
      -- 可以理解为是查询到最后一个单元了.
      -- 设置 j := len, 让外部的循环处理可以结束了.
      j  := len;
      -- 获取最后一个单元的内容.
      str := SUBSTR(p_str, i);
      -- 结果追加一行.
      str_split.EXTEND;
      -- 设置结果内容.
      str_split(str_split.COUNT) := ty_row_str_split(strValue => str);

      IF i >= len THEN
        EXIT;
      END IF;
    ELSE
      -- 如果在被分割的源字符串中,找到了 分隔字符串.
      -- 首先,获取分割的内容.
      str := SUBSTR(p_str, i, j - i);
      -- 然后设置索引, 下一次再查找的时候,从指定的索引位置开始(不是从0开始找了)
      i := j + len1;
      -- 结果追加一行.
      str_split.EXTEND;
      -- 设置结果内容.
      str_split(str_split.COUNT) := ty_row_str_split(strValue => str);
    END IF;
  END LOOP;

  RETURN str_split;
END fn_split;
时间: 2024-08-30 17:25:47

将在一列的以逗号隔开的列数据转化为行数据显示的函数的相关文章

SqlSever基础 脚本添加一个表中的两个列用逗号隔开

1 code 1 select * from sysdatabases 2 3 --指定添加列的数据库,helloworld 4 use helloworld 5 6 --创建表 表的名字 7 create table TeacherClass 8 ( 9 -- 列名 数据类型 不可为空 做主键 设置标识属性(种子,增长值) 列之间用逗号分开 10 Id int not null primary key identity(1,1) , 11 12 -- 列名 数据类型(有中国字,不确定长度) 1

Sql Server 列转逗号隔开的字符串 和 逆转

SELECT STUFF(( SELECT ',' + ModifyBy FROM dbo.tbl_stationprofile FOR XML PATH('') ), 1, 1, '') AS Name 逗号隔开的字符串转表 USE [MBG3SDB] GO /****** Object: UserDefinedFunction [dbo].[GetIDList] Script Date: 2017/9/12 10:13:38 ******/ SET ANSI_NULLS ON GO SET

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

我们日常开发中,不管是表设计问题抑或是其他什么原因,或多或少都会遇到一张表中有一个字段存储的内容是用逗号隔开的列表. 具体效果如下图: ------> 从左边图转换成右边图,像这种需求,我们难免会遇到. 今天我写了个存储过程来解决这种问题.主要方式是利用master..spt_values表. 具体存储过程如下: -- Author: LHM -- Create date: 2015-01-10 -- Description: 把表中某一个列按照逗号拼接列表 --示例: EXEC [Sp_Str

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

原文:[原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式 我们日常开发中,不管是表设计问题抑或是其他什么原因,或多或少都会遇到一张表中有一个字段存储的内容是用逗号隔开的列表. 具体效果如下图: ------> 从左边图转换成右边图,像这种需求,我们难免会遇到. 今天我写了个存储过程来解决这种问题.主要方式是利用master..spt_values表. 具体存储过程如下: -- Author: LHM -- Create date: 2015-01-10 -- Description: 把

输入几个数字,用逗号隔开系列例题

输入n个数字,用逗号分隔 处理过程如下: char str[100]; char ch = '\0'; int i = 0; vector<int> v; int tmp = 0; cin >> str; while (str[i] != '\0'){         while (str[i]!='\0' && str[i] != ','){             tmp = tmp * 10 + str[i]-'0';             ++i; } v

字符串用逗号隔开;有逗号的字符串遍历

字符串用逗号隔开 js中 var ids="[]";var rowsData = $('#dg').datagrid('getSelections');for ( var i = 0; i < rowsData.length; i++) { ids.push(rowsData[i].id);}var str1 = ids.join(','); //1,2,3 var val = $(this).combobox('getValues').join(',');var str2=va

js 正则表达式 验证 ip列表--详情:页面中一个输入框,可输入1个或多个IP,使用英文逗号隔开

var isIp = function (){     var regexp = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;                  return function(value){         var valid = regexp.test(value);         if(!valid){//首先必须是 xxx.xxx.xxx.xxx 类型的数字,如果不是,返回false             return false;

Linux下使用xargs将多行文本转换成一行并用tr实现逗号隔开

准备: cat test.txt 1 3 4 示例: cat test.txt | xargs 1 3 4 可以看出得到的字符串为空格隔开的. 再把上面的字符串用逗号隔开,可以使用tr命令进行空格的替换 cat test.txt | xargs | tr ' ' ',' 不过tr命令只能替换单个字符,多个字符无法实现. 使用sed实现多个字符串的替换: cat test.txt | xargs | sed /s/ /','/g sed可以替换多个字符串,可以弥补tr的不足,后面g表示匹配多个.

内存数据库中列转行的应用,h2中列转行,hsqldb中列转行

其实列转行是比较简单的用sum和decode函数就可以了,但是我遇到的项目,不知道数据谁设计的居然字段里面还设计成long类型,此long类型与java中的不同,oracle中的long是指可变长二进制数据,最长2G,哎没办法只好转换了. 以下是hsqldb的转换,用到了转换函数convert,可以将long类型的转换为double类型,其中d.value是long类型,status是int类型,所以value需要转换 SELECT P.NAME,P.ID, SUM(DECODE(D.K_NAM