活动介绍

oracle split某个字段并且去重

时间: 2025-04-06 16:15:19 浏览: 76
### Oracle Split 字段去重查询示例 在 Oracle 数据库中,可以通过 `REGEXP_SUBSTR` 和集合操作(如 `DISTINCT` 或者子查询)实现对字段的拆分以及去重。以下是具体的解决方案: #### 方法一:基于正则表达式的拆分与去重 可以利用 `REGEXP_SUBSTR` 函数逐一分割字符串中的每一部分,并通过 `CONNECT BY LEVEL` 实现递归查询。最后使用 `DISTINCT` 来去除重复项。 ```sql WITH split_data AS ( SELECT DISTINCT REGEXP_SUBSTR(your_column, '[^,]+', 1, LEVEL) AS item FROM your_table CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(your_column, '[^,]', '')) + 1 ) SELECT item FROM split_data WHERE item IS NOT NULL; ``` 上述代码解释如下: - `your_column` 是需要被分割的目标列名。 - `[^,]+` 表示匹配逗号之间的任意字符组合[^3]。 - `LEVEL` 控制递归层次,确保能够提取出所有的子串。 - `DISTINCT` 关键字用于移除重复值。 #### 方法二:结合表函数进行更灵活的操作 如果希望更加高效或者支持复杂的分隔符逻辑,则可以定义自定义 PL/SQL 函数来进行拆分。下面是一个简单的例子: ```plsql CREATE OR REPLACE TYPE string_list_type AS TABLE OF VARCHAR2(4000); / CREATE OR REPLACE FUNCTION split_string(p_str IN VARCHAR2, p_delimiter IN VARCHAR2 DEFAULT ',') RETURN string_list_type PIPELINED IS v_token VARCHAR2(4000); BEGIN FOR i IN (SELECT TRIM(REGEXP_SUBSTR(p_str, '[^' || p_delimiter || ']+', 1, LEVEL)) token FROM DUAL CONNECT BY LEVEL <= REGEXP_COUNT(p_str, p_delimiter) + 1) LOOP IF i.token IS NOT NULL THEN PIPE ROW(i.token); END IF; END LOOP; END; / ``` 调用此函数时可以直接获取已拆分的结果集,并自动过滤掉重复项: ```sql SELECT DISTINCT COLUMN_VALUE AS item FROM TABLE(split_string('apple,banana,orange,apple')); ``` 这里我们创建了一个名为 `split_string` 的函数,它可以接受输入字符串和指定的分隔符,默认情况下是以逗号 `,` 进行划分[^1]。 --- ### 结合实际场景优化性能 当面对大量数据时,可能还需要考虑进一步提升效率。例如,在某些特定条件下可采用 `LISTAGG` 将结果重新聚合起来后再做后续处理[^4]。 ```sql SELECT LISTAGG(item, ',') WITHIN GROUP (ORDER BY ROWNUM) AS result FROM ( SELECT DISTINCT REGEXP_SUBSTR(your_column, '[^,]+', 1, LEVEL) AS item FROM your_table CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(your_column, '[^,]', '')) + 1 ) WHERE item IS NOT NULL; ``` 这种方法不仅实现了拆分与去重的功能,还提供了最终结果的一次性展示形式。 --- ### 总结 以上两种方式分别适用于不同复杂度的需求环境。对于简单情况推荐直接运用 SQL 内置工具完成任务;而对于更高灵活性的要求,则建议构建专属辅助程序来增强可控性和扩展能力。
阅读全文

相关推荐

如下SQL是查询上班刷卡异常,INTIME排班上班,OUTTIME排班下班, 有考勤卡,无门禁卡或门禁卡时间>=考勤卡时间,显示考勤时间对应每笔门禁时间,不使用MIN(FF_MJ.FGT02),但并未显示出有考勤无门禁卡的, 请协助修改,并优化oracle如下SQL性能,提高执行效率和减少资源占用:SELECT 'ON', BASE.WORK_DATE, '', BASE.PLANT, '', BASE.EMP_CODE, BASE.EMPNAME, BASE.RANK_NAME, BASE.ORG_CODE, BASE.ORG_NAME, BASE.EMPTYPE, BASE.DUTY_NAME, BASE.HOLIDAY, BASE.WS_NUMBER, BASE.WS_SIMPLE_NAME, BASE.DAYTYPE, BASE.INTIME, BASE.OUTTIME, KQ_REC.FGT02 AS KQ_FGT02, -- 考勤卡时间 MJ_REC.FGT02 AS MJ_FGT02, -- 每笔门禁时间 NULL AS MJ_FGT03, NULL, NULL, NULL, NULL, 'LSHR', SYSDATE, 'SP_SYNC_KQ_MJ_CARD_EXP' FROM ( SELECT T.WORK_DATE, DECODE(P.WORK_PLACE, 0, '一园', 1, '二园', 2, '三园', 'NULL') AS PLANT, T.EMP_CODE, T.EMPNAME, P.RANK_NAME, P.ORG_CODE, P.ORG_NAME, P.EMPTYPE, P.DUTY_NAME, DECODE(D.DATE_STATUS, 0, 'N', 1, 'H', 3, 'S') AS HOLIDAY, T.WS_NUMBER, T.WS_SIMPLE_NAME, DECODE(T.WS_INTERVAL, 0, '白班', 1, '晚班') AS DAYTYPE, T.INTIME, T.OUTTIME FROM HCP.LSHR_CARDING_V T JOIN HCP.TZ_EMP_IN P ON T.EMP_CODE = P.EMPCODE JOIN HCP.V_CLK_TZ_EMP_CALENDER_INFO D ON T.EMP_CODE = D.EMP_CODE AND T.WORK_DATE = D.CLD_DATE WHERE T.WORK_DATE = TRUNC(SYSDATE) - 2 ) BASE -- 考勤卡记录(必须存在) JOIN HCP.FGT_FILE_KQMJ KQ_REC ON KQ_REC.FGT10 = BASE.EMP_CODE AND KQ_REC.FGT03 = '1' AND LENGTH(KQ_REC.FGT08) = 5 AND SUBSTR(KQ_REC.FGT08, 3, 1) IN ('1','2') AND KQ_REC.FGT02 BETWEEN BASE.INTIME - 2/24 AND BASE.INTIME + 5/24 -- 门禁卡记录(左连接,允许不存在) LEFT JOIN HCP.FGT_FILE_KQMJ MJ_REC ON MJ_REC.FGT10 = BASE.EMP_CODE AND MJ_REC.FGT03 = '1' AND LENGTH(MJ_REC.FGT08) = 5 AND SUBSTR(MJ_REC.FGT08, 3, 1) = '3' AND MJ_REC.FGT02 BETWEEN BASE.INTIME - 2/24 AND BASE.INTIME + 5/24 WHERE -- 异常条件:无门禁卡或门禁时间≥考勤时间 (MJ_REC.ROWID IS NULL OR MJ_REC.FGT02 >= KQ_REC.FGT02) -- 确保考勤卡是最新记录(避免重复) AND KQ_REC.FGT02 = ( SELECT MAX(FGT02) FROM HCP.FGT_FILE_KQMJ WHERE FGT10 = BASE.EMP_CODE AND FGT03 = '1' AND LENGTH(FGT08) = 5 AND SUBSTR(FGT08, 3, 1) IN ('1','2') AND FGT02 BETWEEN BASE.INTIME - 2/24 AND BASE.INTIME + 5/24 );

pdf
内容概要:本文档主要展示了C语言中关于字符串处理、指针操作以及动态内存分配的相关代码示例。首先介绍了如何实现键值对(“key=value”)字符串的解析,包括去除多余空格和根据键获取对应值的功能,并提供了相应的测试用例。接着演示了从给定字符串中分离出奇偶位置字符的方法,并将结果分别存储到两个不同的缓冲区中。此外,还探讨了常量(const)修饰符在变量和指针中的应用规则,解释了不同类型指针的区别及其使用场景。最后,详细讲解了如何动态分配二维字符数组,并实现了对这类数组的排序与释放操作。 适合人群:具有C语言基础的程序员或计算机科学相关专业的学生,尤其是那些希望深入理解字符串处理、指针操作以及动态内存管理机制的学习者。 使用场景及目标:①掌握如何高效地解析键值对字符串并去除其中的空白字符;②学会编写能够正确处理奇偶索引字符的函数;③理解const修饰符的作用范围及其对程序逻辑的影响;④熟悉动态分配二维字符数组的技术,并能对其进行有效的排序和清理。 阅读建议:由于本资源涉及较多底层概念和技术细节,建议读者先复习C语言基础知识,特别是指针和内存管理部分。在学习过程中,可以尝试动手编写类似的代码片段,以便更好地理解和掌握文中所介绍的各种技巧。同时,注意观察代码注释,它们对于理解复杂逻辑非常有帮助。