我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次出现之前的数据是否存在(并允许最后一个值).有任何想法吗?
我需要选择字符串中的前 X 个单词,其中 x 可以是 0-100 之间的任何数字。是否有捷径可寻?我找到了以下示例来从字符串中选择前 2 个单词:
select regexp_replace('Hello world this is a test', '(\w+ \w+).*$','\1') as first_two
from dual
Run Code Online (Sandbox Code Playgroud)
如何从字符串中选择前 X 个单词,其中 X 可以是 0-100 之间的数字?
我有一个存储过程,其中 Execute Immediate 将调用“Begin ... End”块,其中包含另一个 Execute Immediate,只有在满足特定条件时才会调用该块。
"Begin... End clock" 内部的 Execute Immediate 命令用单引号括起来。所以它看起来像
BEGIN
...SOME STUFF HERE...
FOR ..... LOOP
EXECUTE IMMEDIATE
'BEGIN
IF (condition) THEN
EXECUTE IMMEDIATE 'DML STRING'
END IF
END;'
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
这就引出了另一个问题,是否可以从循环内调用 Execute Immediate 语句。我认为答案是肯定的。
寻找方法从 Oracle SQL 中的 StudentID 中过滤掉特殊符号、字母等,并将这些记录显示为无效。
过滤掉字母 aZ 和其他字符的最佳方法是什么?(只留下数字)
SELECT replace(Translate(studentid,'a-Z<>!-\+=/&', '??'),'?','') as StudentID, 'Invalid Characters in Student ID'
FROM students
Run Code Online (Sandbox Code Playgroud)