我知道这已经在某种程度上得到了PHP和MYSQL的回答,但我想知道是否有人可以教我最简单的方法将字符串(逗号分隔)拆分为Oracle 10g(最好)和11g中的多行.
表格如下:
Name | Project | Error
108 test Err1, Err2, Err3
109 test2 Err1
Run Code Online (Sandbox Code Playgroud)
我想创建以下内容:
Name | Project | Error
108 Test Err1
108 Test Err2
108 Test Err3
109 Test2 Err1
Run Code Online (Sandbox Code Playgroud)
我已经看到了一些围绕堆栈的潜在解决方案,但是它们只占了一个列(以逗号分隔的字符串).任何帮助将不胜感激.
我有点不好意思:我被要求从数据库中的特定字符串开始接收注释,并将结果分成不同的列.
例如 - 如果返回的值是这样的:
COLUMN_ONE
--------------------
'D7ERROR username'
Run Code Online (Sandbox Code Playgroud)
回报需要是:
COL_ONE COL_TWO
--------------------
D7ERROR username
Run Code Online (Sandbox Code Playgroud)
一旦结构集的结构只是为了将字符串拆分为两个,是否可以定义列?
我在 Oracle SQL 中有这样的查询:
select town_name,
regexp_substr(town_name, '[^A,]+', 1, 1) as c1,
regexp_substr(town_name, '[^A,]+', 1, 2) as c2,
regexp_substr(town_name, '[^A,]+', 1, rownum) as c_rownum,
rownum
from epr_towns
Run Code Online (Sandbox Code Playgroud)
结果的前 2 行是:
VALGANNA V LG V 1
VARANO BORGHI V R R 2
Run Code Online (Sandbox Code Playgroud)
我需要在 PostgreSQL 上获得相同的结果(对于带有 的行regexp_substr(town_name, '[^A,]+', 1, rownum) as c_rownum),但我不知道如何实现。你可以帮帮我吗?谢谢。
我REGEXP_SUBSTR()用来从逗号分隔列表中返回第n个值.这在所有值都存在时工作正常,但如果项为null则失败.这是一个适用于所有值存在的示例,我选择第二次出现的不是逗号的1个或多个字符:
SQL> select REGEXP_SUBSTR('1,2,3,4,5,6', '[^,]+', 1, 2) data
2 from dual;
D
-
2
Run Code Online (Sandbox Code Playgroud)
但是当第二个值为null时,我真的得到列表中的第三个项目,当然这实际上是第二个出现的1个或多个不是逗号的字符.但是,我需要它返回NULL,因为第二项是空的:
SQL> select REGEXP_SUBSTR('1,,3,4,5,6', '[^,]+', 1, 2) data
2 from dual;
D
-
3
Run Code Online (Sandbox Code Playgroud)
如果我将正则表达式更改为允许零个或多个字符而不是1或更多,则对于超过null的数字也会失败:
SQL> select REGEXP_SUBSTR('1,,3,4,5,6', '[^,]*', 1, 4) data
2 from dual;
D
-
3
Run Code Online (Sandbox Code Playgroud)
我需要允许null但似乎无法使语法正确.从逻辑上讲,我需要返回逗号第n次出现之前的数据是否存在(并允许最后一个值).有任何想法吗?
我找不到有关如何在ORACLE中拆分逗号分隔字符串的解决方案.搜索了很多,没有什么适用于我的情况
码
DECLARE
TYPE T_ARRAY_OF_VARCHAR IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
MY_ARRAY T_ARRAY_OF_VARCHAR;
MY_STRING VARCHAR2(2000) := '12 3,456,,abc,def';
BEGIN
FOR CURRENT_ROW IN (
with test as
(select MY_STRING from dual)
select regexp_substr(MY_STRING, '[^,]+', 1, rownum) SPLIT
from test
connect by level <= length (regexp_replace(MY_STRING, '[^,]+')) + 1)
LOOP
DBMS_OUTPUT.PUT_LINE('>' || CURRENT_ROW.SPLIT || '<');
--DBMS_OUTPUT.PUT_LINE(CURRENT_ROW.SPLIT);
MY_ARRAY(MY_ARRAY.COUNT) := CURRENT_ROW.SPLIT;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Array Size:' || MY_ARRAY.COUNT);
END;
Run Code Online (Sandbox Code Playgroud)
/
输出是:
>12 3<
>456<
>abc<
>def<
><
Array Size:5
Run Code Online (Sandbox Code Playgroud)
空值无序!!!!
我正在尝试用regexp_subtr拆分字符串,但我无法使它工作.
所以,首先,我有这个查询
select regexp_substr('Helloworld - test!' ,'[[:space:]]-[[:space:]]') from dual
Run Code Online (Sandbox Code Playgroud)
非常好地提取我的分隔符 - 空白 - 空白
但是,当我尝试使用此选项拆分字符串时,它只是不起作用.
select regexp_substr('Helloworld - test!' ,'[^[[:space:]]-[[:space:]]]+')from dual
Run Code Online (Sandbox Code Playgroud)
查询什么都不返回.
将非常感谢帮助!谢谢
我想用分号分隔的字符串分成PL/SQL的部分.只要字符串中没有圆括号,它就可以正常使用REGEXP_SUBSTR.
例:
select REGEXP_SUBSTR('A;B;C','[^(";")]+',1,1),
REGEXP_SUBSTR('A;B;C','[^(";")]+',1,2),
REGEXP_SUBSTR('A;B;C','[^(";")]+',1,3)
from dual;
Run Code Online (Sandbox Code Playgroud)
预期的结果是:ABC
A; B(1); C的结果应该是AB(1)C,但我得到的是:AB 1
select REGEXP_SUBSTR('A;B(1);C','[^(";")]+',1,1),
REGEXP_SUBSTR('A;B(1);C','[^(";")]+',1,2),
REGEXP_SUBSTR('A;B(1);C','[^(";")]+',1,3)
from dual;
Run Code Online (Sandbox Code Playgroud)
这意味着'('被检测为分隔符,但我不明白这种行为.有人可以开导我吗?
从字符串中提取单词的最佳方法是什么?我已经做了一些事情,因为我找到了许多方法,但没有一个看起来"简单".
我们假设有一个名为'change_opening_hours'的程序.此过程具有名为"v_perioden"的时间范围字符串输入.
这个字符串看起来像:
'10:00-12:00' 或
'10:00-12:00 14:00-16:00' 或
'10:00-12:00 14:00-16:00 18:00-22:00' 等
现在我已经自己做了一些事情来从这个输入中抽出每一段时间.
v_perioden VARCHAR2(50) := '10:00-12:00 14:00-18:00 22:00-24:00';
...
-- loop though time-periode depeningd
-- on amount of spaces
FOR i IN 0..REGEXP_COUNT(v_perioden, ' ') LOOP
-- first period
IF i = 0 THEN DBMS_OUTPUT.PUT_LINE(SUBSTR(v_perioden, 0, 11));
-- second period
ELSIF i = 1 THEN DBMS_OUTPUT.PUT_LINE(SUBSTR(v_perioden, 13, 11));
--thirt period
ELSIF i = 2 THEN DBMS_OUTPUT.PUT_LINE(SUBSTR(v_perioden, 25, 11));
END IF;
END LOOP;
Run Code Online (Sandbox Code Playgroud)
输出:
10:00-12:00
14:00-18:00
22:00-24:00
Run Code Online (Sandbox Code Playgroud)
现在这种方式工作正常,但它不是那么有能力.我试图找出如何从空间中的字符串中提取单词,但这并没有成功.