帮忙看下这个sql怎么写

jcc3120 2017-11-09 09:56:55
数据
ST_CODE
H0201
H020115
H0101
H010102
H03


查询完得出以下数据
ST_CODE
H0201
H0101
H03
...全文
252 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jcc3120 2017-11-09
  • 打赏
  • 举报
回复
OK 感谢。结贴
碧水幽幽泉 2017-11-09
  • 打赏
  • 举报
回复
考虑st_code可能存在重复的情况,所以加了distinct
碧水幽幽泉 2017-11-09
  • 打赏
  • 举报
回复
试试这个:

with tmp as
(
select 'H0201' st_code from dual union all
select 'H020115' from dual union all
select 'H0101' from dual union all
select 'H010102' from dual union all
select 'H020103' from dual union all
select 'H03' from dual
)
select distinct t1.st_code
from tmp t1
where not exists(select null
from tmp t2
where instr(t1.st_code, t2.st_code) >0
and t2.st_code <> t1.st_code
);
chengccy 2017-11-09
  • 打赏
  • 举报
回复
修正一下, 0H03情况处理
WITH TMP AS
 (SELECT 'H0201' ST_CODE
  FROM   DUAL
  UNION ALL
  SELECT 'H020115'
  FROM   DUAL
  UNION ALL
  SELECT 'H0101'
  FROM   DUAL
  UNION ALL
  SELECT 'H010102'
  FROM   DUAL
  UNION ALL
  SELECT 'H03'
  FROM   DUAL
  UNION ALL
  SELECT '0H03'
  FROM   DUAL)
SELECT *
FROM   TMP T
WHERE  NOT EXISTS (SELECT 1
        FROM   TMP T1
        WHERE  REGEXP_LIKE(T.ST_CODE, '^'||T1.ST_CODE)
        AND    T1.ST_CODE <> T.ST_CODE)
chengccy 2017-11-09
  • 打赏
  • 举报
回复
WITH TMP AS
 (SELECT 'H0201' ST_CODE
  FROM   DUAL
  UNION ALL
  SELECT 'H020115'
  FROM   DUAL
  UNION ALL
  SELECT 'H0101'
  FROM   DUAL
  UNION ALL
  SELECT 'H010102'
  FROM   DUAL
  UNION ALL
  SELECT 'H03'
  FROM   DUAL)
SELECT *
FROM   TMP T
WHERE  NOT EXISTS (SELECT 1
        FROM   TMP T1
        WHERE  REGEXP_LIKE(T.ST_CODE, T1.ST_CODE)
        AND    T1.ST_CODE <> T.ST_CODE)
jcc3120 2017-11-09
  • 打赏
  • 举报
回复
引用 3 楼 jcc3120 的回复:
[quote=引用 2 楼 qq646748739 的回复:] 数据筛选规则是什么?为什么H020115、H010102过滤掉了?
规则是前缀最小的不同的。就是H020115 包含 H0201 然后取 H0201 , H0201 没有包含其他的数据,相当于这些数据中一个父节点了。 如果记录中有H,那只取H就可以。[/quote] 是这么回事。
碧水幽幽泉 2017-11-09
  • 打赏
  • 举报
回复
--长度不限,场景非常多,我暂列5种
H02 --取H02
H0201
H020115

H030 --取H030
H0301
H010103

H0401 --取H0401
H040104

H05010 --取H05010
H050101

H060101 --取H060101
H0601012

H07010123 --取H07010123
....

这样的取值是非常灵活的。
如果接着再来个H03、H04、H05、H06、H07 就要推翻上面所有的判断。
最后要是再来个H,就只取H一条数据了。
jcc3120 2017-11-09
  • 打赏
  • 举报
回复
引用 2 楼 qq646748739 的回复:
数据筛选规则是什么?为什么H020115、H010102过滤掉了?
规则是前缀最小的不同的。就是H020115 包含 H0201 然后取 H0201 , H0201 没有包含其他的数据,相当于这些数据中一个父节点了。 如果记录中有H,那只取H就可以。
碧水幽幽泉 2017-11-09
  • 打赏
  • 举报
回复
数据筛选规则是什么?为什么H020115、H010102过滤掉了?
jcc3120 2017-11-09
  • 打赏
  • 举报
回复
数据长度不定。

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧