Oracle管道分隔列数据筛选需求:按指定条件提取记录
Oracle数据筛选解决方案
数据表结构与样本数据
| Column1 | Column2 |
|---|---|
| ABC|DEF|GHI|JKL|XYZ | Y|Y|N|N|Y |
| ABC|JKL|XYZ | Y|Y|N |
| GHI|XYZ | Y|Y |
| GHI|JKL | N|Y |
筛选规则
提取满足以下条件的记录:Column1中包含ABC、DEF、JKL或XYZ任意一个值,且Column2中对应位置的取值为Y。
实现SQL语句
WITH split_data AS ( SELECT t.Column1, t.Column2, REGEXP_SUBSTR(t.Column1, '[^|]+', 1, level) AS col1_item, REGEXP_SUBSTR(t.Column2, '[^|]+', 1, level) AS col2_item FROM your_table t CONNECT BY level <= REGEXP_COUNT(t.Column1, '\|') + 1 AND PRIOR t.Column1 = t.Column1 AND PRIOR SYS_GUID() IS NOT NULL ) SELECT DISTINCT Column1, Column2 FROM split_data WHERE col1_item IN ('ABC', 'DEF', 'JKL', 'XYZ') AND col2_item = 'Y';
逻辑说明
- 拆分字符串:通过
REGEXP_SUBSTR和递归CONNECT BY,将Column1和Column2按分隔符|拆分成逐行的对应项,保证每个位置的元素一一匹配。 - 匹配筛选条件:在拆分后的数据集里,筛选出目标项(ABC/DEF/JKL/XYZ)且对应位置为Y的条目。
- 去重返回原记录:用
DISTINCT确保原表中符合条件的记录仅返回一次,避免因多个位置满足条件导致重复输出。
预期结果
执行上述SQL后,将返回所有样本记录(每条记录均满足至少一个筛选条件):
| Column1 | Column2 |
|---|---|
| ABC|DEF|GHI|JKL|XYZ | Y|Y|N|N|Y |
| ABC|JKL|XYZ | Y|Y|N |
| GHI|XYZ | Y|Y |
| GHI|JKL | N|Y |
内容的提问来源于stack exchange,提问作者hanuma sachin
相关产品推荐
相关产品推荐

