Oracle不同行的某列字符串相加,去除重复值

本文深入探讨了一种使用SQL实现特定数据聚合和排序需求的方法,包括使用WITH语句创建临时视图、sys_connect_by_path函数处理树形结构数据、REVERSE函数反转字符串等技巧。通过实例演示,展示了如何优化SQL查询以达到高效处理数据的目标。

有如下表Test

City People Make
广州  1        A
广州  2        B
广州  3        C
上海  4        A
上海  5        E
广州  6        A
上海  7        E

实现如下效果
City People Make
上海  16     AE
广州  12     ABC

在公司论坛看到有人对这个要求的实现,觉得有点复杂。自己研究了下,重新写了下sql如下:

9I(没有环境测试,但是函数在9I中好像都是已经有了的):

WITH TEST AS (SELECT CITY,MAKE,SUM(PEOPLE) PEOPLE FROM Test GROUP BY CITY,MAKE ORDER BY CITY,MAKE)

SELECT CITY,SUM(PEOPLE),(select REVERSE(ltrim(max(sys_connect_by_path(MAKE,',')),',')) MAKE
from
(   
SELECT MAKE,CITY,ROWNUM numberid FROM TEST
) T1 WHERE T1.CITY = T2.CITY
start with T.CITY = T2.CITY connect by prior numberid = numberid+1
) MAKE FROM TEST T2 GROUP BY CITY


10G:

WITH TEST AS (SELECT CITY,MAKE,SUM(PEOPLE) PEOPLE FROM Test GROUP BY CITY,MAKE ORDER BY CITY,MAKE)
SELECT CITY,SUM(PEOPLE),WMSYS.WM_CONCAT(MAKE) FROM TEST GROUP BY CITY

==========================================================

相关关键字:

1.sys_connect_by_path 函数主要作用是可以把一个父节点下的所有子节点通过某个字符进行区分

2.start with ...  connect by prior ... 递归实现,如

start with pid= 1 connect by prior pid = id

//父id=子id   正树型结构    子id=父id 倒树型结构
上面的SQL中注意

start with T.CITY = T2.CITY connect by prior numberid = numberid+1

与start with T.CITY = T2.CITY connect by prior numberid+1 = numberid的区别

3.REVERSE字符串反转

===========================================================

回顾下其他:

1.Group By, Having, Where, Order by几个语句的执行顺序。一个SQL语句往往会产生多个临时视图,那么这些关键字的执行顺序就非常重要了,因为你必须了解这个关键字是在对应视图形成前的字段进行操作还是对形成的临时视图进行操作,这个问题在使用了别名的视图尤其重要。以上列举的关键字是按照如下顺序进行执行的:Where, Group By, Having, Order by

Oracle数据库中,若要检查表中某的两个字符串值是否相等,可以通过SQL语句直接进行比较操作。Oracle提供了标准的SQL运算符用于此类判断,例如使用`=`来判断两个字符串是否相等。 ### 使用基本的SQL比较 以下是一个基本的SQL查询示例,用于查找某一中两个字符串值是否相同: ```sql SELECT * FROM your_table WHERE column_name = 'target_string'; ``` 此查询将返回表`your_table`中所有`column_name`值等于`'target_string'`的记录[^3]。 ### 比较两之间的字符串是否相等 如果需要比较同一表中两个字符串值是否相等,可以使用如下SQL语句: ```sql SELECT * FROM your_table WHERE column1 = column2; ``` 该查询将返回`column1`和`column2`中值相等的所有记录。 ### 忽略大小写的比较 如果希望忽略大小写进行比较,可以在比较之前将两个字符串都转换为大写或小写格式: ```sql SELECT * FROM your_table WHERE UPPER(column1) = UPPER(column2); ``` 此查询将返回`column1`和`column2`中区分大小写的相等字符串记录。 ### 使用PL/SQL函数进行更复杂的比较 对于更复杂的字符串比较需求,例如动态传入字符串进行比较,可以编写PL/SQL函数实现: ```plsql CREATE OR REPLACE FUNCTION compare_strings(p_str1 IN VARCHAR2, p_str2 IN VARCHAR2) RETURN VARCHAR2 IS BEGIN IF p_str1 = p_str2 THEN RETURN 'Equal'; ELSE RETURN 'Not Equal'; END IF; END; ``` 调用该函数的方式如下: ```sql SELECT compare_strings('string1', 'string1') AS result FROM dual; ``` 此函数将返回`'Equal'`或`'Not Equal'`以表示两个字符串是否相等[^2]。 ### 结合正则表达式进行模式匹配 虽然正则表达式主要用于验证字符串内容是否符合特定模式,但也可以用于某些特定情况下的字符串比较。例如,通过`REGEXP_LIKE`可以检查某个字段是否与目标字符串完全匹配: ```sql SELECT * FROM your_table WHERE REGEXP_LIKE(column_name, '^target_string$'); ``` 此查询将返回`column_name`中值严格等于`'target_string'`的所有记录。 通过上述方法,可以根据具体需求灵活地在Oracle数据库中实现字符串比较功能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值