如何在Oracle SQL的CASE WHEN语句中排除以BAR开头的VALUE值?
Oracle SQL:排除以特定前缀开头的记录
原查询语句
SELECT DISTINCT A, CASE WHEN Parameter = 'ID' AND REGEXP_LIKE(VALUE, 'FOO') THEN VALUE ELSE 'NA' END AS test FROM my_table;
原表数据
| A | parameter | value |
|---|---|---|
| x | ID | FOO1223 |
| y | ID | FOO5462 |
| z | ID | empy |
| p | ID | BAR5432 |
当前结果
| A | test |
|---|---|
| x | FOO1223 |
| y | FOO5462 |
| z | NA |
| p | NA |
需求
需要排除VALUE以BAR开头的记录,得到如下期望结果:
| A | test |
|---|---|
| x | FOO1223 |
| y | FOO5462 |
| z | NA |
解决方案
要直接排除目标记录,最高效的方式是在WHERE子句中添加过滤条件。针对前缀匹配,使用LIKE比正则表达式性能更优:
SELECT DISTINCT A, CASE WHEN Parameter = 'ID' AND REGEXP_LIKE(VALUE, 'FOO') THEN VALUE ELSE 'NA' END AS test FROM my_table WHERE VALUE NOT LIKE 'BAR%'; -- 过滤掉以BAR开头的行
如果你偏好使用正则表达式,也可以写成:
SELECT DISTINCT A, CASE WHEN Parameter = 'ID' AND REGEXP_LIKE(VALUE, 'FOO') THEN VALUE ELSE 'NA' END AS test FROM my_table WHERE NOT REGEXP_LIKE(VALUE, '^BAR'); -- ^表示匹配字符串开头
两种写法都能得到你想要的结果,优先推荐LIKE写法,因为它在处理前缀匹配时的执行效率更高。
内容的提问来源于stack exchange,提问作者honeymoon
相关产品推荐
相关产品推荐

