前段时间使用ORACLE,同事提出一个需求,要求将有相同CODE的值连接成一个字符串。这种小问题怎会难倒我,于是提出方案!
建表语句:
create table SP_ALERT_PA_GROUP
(
ID INTEGER not null,
ALERTCODE VARCHAR2(8),
PAINNERCODE VARCHAR2(20)
)
insert into sp_alert_pa_group (ID, ALERTCODE, PAINNERCODE)
values (10081, 'AL000027', 'R0000005');
insert into sp_alert_pa_group (ID, ALERTCODE, PAINNERCODE)
values (10082, 'AL000027', 'R0000006');
insert into sp_alert_pa_group (ID, ALERTCODE, PAINNERCODE)
values (10083, 'AL000026', 'R0000001');
insert into sp_alert_pa_group (ID, ALERTCODE, PAINNERCODE)
values (10084, 'AL000026', 'R0000002');
要求显示的结果
ALERTCODE PAINNERCODE
AL000027 R0000005,R0000006,
AL000026 R0000001,R0000002,
1.使用自定义函数
CREATE OR REPLACE FUNCTION getpa(alertcode VARCHAR2)
RETURN VARCHAR2
IS
pastr VARCHAR2(4000);
BEGIN
FOR cur IN (SELECT painnercode FROM sp_alert_pa_group WHERE alertcode=alertcode) LOOP
pastr := pastr||cur.painnercode||',';
END LOOP;
RETURN pastr;
END;
然后使用下面的SQL查询即可!
SELECT DISTINCT alertcode ,getpa(alertcode) FROM sp_alert_pa_group f
2.使用ORACLE内置函数实现。只支持10G以上
SELECT wmsys.wm_concat(painnercode) FROM sp_alert_pa_group
这个简单明了,但是我这里不能用,哎数据库版本的问题。太低
3.使用SQL语句迭代(sys_connect_by_path)
select substr(max(sys_connect_by_path(painnercode,',')),2) paramcode
from (select a.*,row_number()over(order by painnercode) rn from sp_alert_pa_group a )
start with rn=1
connect by rn-1=prior rn
公司里还使用DB2,下面是DB2中使用自定义函数:
CREATE FUNCTION getpa(v_alertcode VARCHAR(8))
RETURNS VARCHAR(4000)
LANGUAGE SQL
SPECIFIC getpa --SPECIFIC getpa 指定函数名称
gp: BEGIN ATOMIC
DECLARE pastr VARCHAR(4000) DEFAULT '';
FOR cur AS
SELECT painnercode FROM sp_alert_pa_group WHERE alertcode=v_alertcode
DO
SET pastr=pastr || cur.painnercode || ',';
END FOR;
RETURN pastr;
END gp;
此处,除了表名不能作为参数传递以外,列都可以用参数代替!
分享到:
相关推荐
Oracle中分组后拼接分组字符串.pdf
Oracle中分组后拼接分组字符串[文].pdf
Oracle Sql 中提供了多种字符串处理函数,用于对字符串进行各种操作,如大小写转换、截取、连接、查找、替换等。下面是 Oracle Sql 中常用的字符串处理函数: 1. 大小写转换函数 Oracle Sql 提供了两个大小写转换...
Excel 导入 oracle 实现从Excel中读取内容,按照一个格式拼成字符串
oracle通过sql实现字符串转数字oracle函数,可用于字符串的最终排序
oracle,按特定字符,截取字符串,直接出结果 oracle,按特定字符,截取字符串,直接出结果oracle,按特定字符,截取字符串,直接出结果
Oracle接收长度大于4000的字符串 Oracle接收长度大于4000的字符串
Oracle 行列转换技巧详解 Oracle 行列转换是指将数据库表中的行转换为列或将列转换为行的一种操作。这种操作在实际应用中非常有用,例如在数据报表生成、数据分析和数据挖掘等领域。下面我们将详细介绍 Oracle 行列...
select f_find('Ap@2233ll@@l@@','@') from dual 返回结果为5,代表‘@’在该字符串中出现5次。 同理 select f_find('Ap@223SWEQQQ3ll@@l@@','Q') from dual---返回3,代表Q在字符串中出现了3次, select f_find('我...
oracle行列转换,通过实例来实现表的行列转换
* 超大字符串拼接,单个字符串4000、分隔符100,可拼出超4000的超长字符串 * 可自定义指定分隔符separator * 可自定义指定排序字段sequence,对于数字或日期类型的字段,先转为字符串,比如to_char(line, 'FM000'...
Oracle行列转换,一个挺经典的例子,值得学习和思考……
本例子主要是实现了oracle行列的转换,这个挺有用的
在实际工作中经常遇到截取两个相同字符串之间的字符的oracle问题,以下是相关语句
oracle拼接字符串查询语句。 普通拼接字符串和拼接某一列的所有值。
Oracle拆分字符串,字符串分割的函数,将返回一个表格,如果有需要的可以下载去看看。
大数据量,返回值虽然是CLOB,依然会报错; CLOB变量需要dbms_lob.createtemporary,临时表空间中,建立临时LOB。 大数据量,返回值虽然是CLOB,依然会报错; CLOB变量需要dbms_lob.createtemporary,临时表空间中,...
oracle中操作字符串(带有,的字符串,从中取出“:”前面或后面的值)
C#连接Oracle数据库字符串 C#连接Oracle数据库字符串