oracle中split字符串的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中split字符串的问题相关的知识,希望对你有一定的参考价值。
请问使用什么办法实现split的功能?
谢谢
例如原先的字符串是“张三,李四,王五”
然后拆成一个集合(“张三”,“李四”,“王五”)
然后我可以在where子句中使用in。
谢谢。
首先声明一个数组类型:
-- 字符串集合
TYPE Typ_Tab_Str IS TABLE OF VARCHAR(150) INDEX BY BINARY_INTEGER;
-- 写一个函数
CREATE OR REPLACE FUNCTION Fun_Stringtoarrary(P_Sourcestr IN VARCHAR2, -- 源字符串
P_Separator IN VARCHAR2, -- 分隔符
P_Arrary OUT Typ_Tab_Str -- 拆分后得到的数组
) RETURN NUMBER IS
n_Count NUMBER(6); -- 分隔符的个数
n_Posb NUMBER(6); -- 初始位置
n_Pose NUMBER(6); -- 分隔符的位置
BEGIN
-- 初始化
n_Count := 0;
n_Posb := 1;
-- 非空校验
IF Prm_Sourcestr IS NULL OR Prm_Separator IS NULL THEN
RETURN - 1;
END IF;
LOOP n_Pose := Instr(Prm_Sourcestr, Prm_Separator, n_Posb, 1);
n_Count := n_Count + 1;
IF n_Pose = 0 THEN
Prm_Arrary(n_Count) := Substr(Prm_Sourcestr, n_Posb, Length(Prm_Sourcestr) - n_Posb + 1);
EXIT;
END IF;
Prm_Arrary(n_Count) := Rtrim(Ltrim(Substr(Prm_Sourcestr, n_Posb, n_Pose - n_Posb))); n_Posb := n_Pose + Length(Prm_Separator);
END LOOP;
RETURN n_Count;
EXCEPTION
WHEN OTHERS THEN
RETURN - 1;
END Fun_Stringtoarrary;追问
oracle没有内置的函数吗
追答没有,只提供了,inner,substr等等简单操作的函数,因为oracle本身就没有数组类型,我们是通过索引表来模拟数组,其实就是一个仿数组的结构。上面的函数完全正确,属于常用自定义功能函数。
本回答被提问者和网友采纳 参考技术B 你是想把一个字符串分成多个么?比如abc拆成a,b,c?如果是这样的话可以用substr(),例如:
substr(abc,1,1)=a,substr(abc,1,2)=ab,substr(abc,2,2)=bc。追问
例如原先的字符串是“张三,李四,王五”
然后拆成一个集合(“张三”,“李四”,“王五”)
然后我可以在where子句中使用in。
谢谢。
一样的substr就是提取部分字符段的函数,可以用到你的集合里。
参考技术C SELECT '('||''''||REPLACE('张三,李四,王五',',',''',''')||''''||')' FROM DUAL;你可以在JAVA理处理:
如何在 oracle 中执行 c# string.split()
【中文标题】如何在 oracle 中执行 c# string.split()【英文标题】:How to do the c# string.split() in oracle 【发布时间】:2020-03-20 19:22:17 【问题描述】:如果存在,如何从字符串的乞求中删除某些单词,如DUM
或PRJ
,然后根据字符_
拆分字符串并获取第二部分。
例如,如果我们采取
DUM_EI_AO_L_5864_Al Meena Tower
我需要以AO
和EI_AE_L_5864_Al radha Tower
作为AE
获得答案
【问题讨论】:
这些都是我已经检查过的并且非常复杂。我需要一个满足我在问题中提到的两个条件的简单答案 您想要查询还是 C# 代码?您是否尝试过在 oracle 查询上执行此操作?当您 1. 展示努力和 2. 通过查询示例展示您想要的内容时,这个问题肯定会得到回答。一旦您提出查询,您的问题可能归结为“LinQ 中的这个 oracle 函数是什么?”。 【参考方案1】:替换要删除的前缀,然后找到第一个和第二个下划线的索引,然后找到这两个分隔符之间的子字符串:
Oracle 设置:
CREATE TABLE your_table ( value ) AS
SELECT 'DUM_EI_AO_L_5864_Al Meena Tower' FROM DUAL UNION ALL
SELECT 'EI_AE_L_5864_Al radha Tower' FROM DUAL
查询:
SELECT value,
SUBSTR( replaced_value, first_separator + 1, second_separator - first_separator - 1 )
AS second_term
FROM (
SELECT value,
replaced_value,
INSTR( replaced_value, '_', 1, 1 ) AS first_separator,
INSTR( replaced_value, '_', 1, 2 ) AS second_separator
FROM (
SELECT value,
REPLACE(
REPLACE(
value,
'PRJ_'
),
'DUM_'
) AS replaced_value
FROM your_table
)
)
输出:
价值 |第二期 :-------------------------------- | :---------- DUM_EI_AO_L_5864_Al Meena 塔 | AO EI_AE_L_5864_Al radha 塔 | AE
查询 2:
你也可以使用正则表达式:
SELECT value,
REGEXP_SUBSTR( value, '(DUM_|PRJ_)?.*?_(.*?)_', 1, 1, NULL, 2 ) AS second_term
FROM your_table
输出:
价值 |第二期 :-------------------------------- | :---------- DUM_EI_AO_L_5864_Al Meena 塔 | AO EI_AE_L_5864_Al radha 塔 | AE
db小提琴here
【讨论】:
以上是关于oracle中split字符串的问题的主要内容,如果未能解决你的问题,请参考以下文章