如何使用SQL Developer根据值出现的次数获取值

问题描述 投票:0回答:1

在此输入图片描述

附图中我有一个键值表, 如何根据key的出现索引获取值。

我只使用 select INSTR ( key, '键5<>' , 1,1 ) 从表; 我应该如何获得分隔符出现的补充值。

我想使用 Oracle SQL Developer 获取 key5 的并行值,即 961 作为我的输出。

database oracle oracle-sqldeveloper
1个回答
0
投票

您的

instr
查询告诉您键的第一个字符在字符串中的位置(即它是第 25 个字符),而不是元素的位置(即它是第五个字符);这根本无法帮助您找到匹配的值,因为它不会从相同的字符位置开始。它还可能会给您带来误报,例如如果“key50”出现在“key5”之前(我猜你的键并不像你所显示的那样真正按顺序排列)。

您可以使用正则表达式来提取所有键和值,并使用递归 CTE(子查询分解)来处理所有键/值对。

create table your_table (key, value) as
select
  'key1<>key2<>key3<>key4<>key5<>key6<>key7<>key8',
  '300<>77<>-15<>40<>961<>1<>300<>-1'
from dual
1 rows affected
with rcte (all_keys, all_values, key_count, pos, key, value) as (
  select key, value, regexp_count(key, '(.*?)(<>|$)'), 1,
    regexp_substr(key, '(.*?)(<>|$)', 1, 1, null, 1),
    regexp_substr(value, '(.*?)(<>|$)', 1, 1, null, 1)
  from your_table
  union all
  select all_keys, all_values, key_count, pos + 1,
    regexp_substr(all_keys, '(.*?)(<>|$)', 1, pos + 1, null, 1),
    regexp_substr(all_values, '(.*?)(<>|$)', 1, pos + 1, null, 1)
  from rcte
  where pos < key_count - 1
)
select pos, key, value from rcte
POS 钥匙 价值
1 键1 300
2 键2 77
3 键3 -15
4 键4 40
5 键5 961
6 键6 1
7 键7 300
8 key8 -1

锚分支获取原始的分隔键和值字符串、键数量的计数,并通过查找与正则表达式模式匹配的第一个值来开始工作。然后递归分支查找连续的匹配项,直到所有键都用完。

然后只需过滤您需要的键值即可:

with rcte (all_keys, all_values, key_count, pos, key, value) as (
  select key, value, regexp_count(key, '(.*?)(<>|$)'), 1,
    regexp_substr(key, '(.*?)(<>|$)', 1, 1, null, 1),
    regexp_substr(value, '(.*?)(<>|$)', 1, 1, null, 1)
  from your_table
  union all
  select all_keys, all_values, key_count, pos + 1,
    regexp_substr(all_keys, '(.*?)(<>|$)', 1, pos + 1, null, 1),
    regexp_substr(all_values, '(.*?)(<>|$)', 1, pos + 1, null, 1)
  from rcte
  where pos < key_count - 1
)
select value
from rcte
where key = 'key5'
价值
961

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.