【问题标题】:How to split a delimited string into n(n-1)/2 to combinations in Oracle SQL?如何将分隔字符串拆分为 n(n-1)/2 到 Oracle SQL 中的组合?
【发布时间】:2019-04-20 09:16:50
【问题描述】:

例如"red/green/blue"拆分成下面的

redred/greenred/green/blue

select * from table where column in('red','red/green','red/green/blue');

【问题讨论】:

  • 请说明您的公式n(n-1)/2 的组合数量。如果字符串是'red/green/blue/yellow',你期望什么输出? . red red/green red/green/blue red/green/blue/yellow 的组合不等于 4(4-1)/2 = 6。向我们展示更多示例以涵盖您的所有场景。另外,您要从表中搜索什么?数据是如何存储的?可能还有其他选择可以做同样的事情,您可能认为拆分是唯一的选择?
  • 如果你有red/green/blue/black,你想要的6个结果是什么?
  • 你说得对,戈登。我的错不是 n(n-1)/2。

标签: sql regex oracle oracle11g


【解决方案1】:

您可以将substrinst 组合用作:

with t as
(
select 'red/green/blue' as str from dual
)
select substr(str,1,instr(str,'/',1,1)-1) str1,
       substr(str,1,instr(str,'/',1,2)-1) str2,
       str as str_whole
  from t;

STR1    STR2        STR_WHOLE
----    ----------  --------------
red     red/green   red/green/blue

如果您想逐行显示,您可以通过添加 regexp_count 来使用以下样式:

with t as
(
select 'red/green/blue' as str from dual
)
select decode(sign(instr(str,'/',1,level)),1,substr(str,1,instr(str,'/',1,level)-1),str)
       as str
  from t
connect by level <= regexp_count(str,'/') + 1; 

STR 
--------------   
red     
red/green   
red/green/blue

Rextester Demo

【讨论】:

  • @jamesdean 不幸的是,即使我们使用 pivot 关键字,也不可能完全动态旋转。动态大小写仅适用于pivot xml,但这不是您想要的,它只提取一个长字符串。
  • 感谢您的帮助。谢谢。
  • @jamesdean 但IN 不是LIKE,完全匹配IN,我的意思是你应该得到UR 的值与'APP/ADMIN/SECURITY''APP' 完全相同。请重试。
  • @james 我看到了你的最后一个问题(#53357976)。您的方法正确,但 UID 参数应该是 USER1 而不是 USER4 以获得 1 的计数,因为 USER1 的 UR 包含 APP/ADMIN/SECURITY 作为查询列表中的组件之一('APP,APP/ADMIN/SECURITY')。
  • 感谢您的时间和帮助@Barbaros
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
相关资源
最近更新 更多