oracle pl sql字符串函数

6bc51xsx  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(366)

我有一个列,其中的值或行是名称和代码的组合,如下所示。
数据流

Column_X
---------------------------
Saint_Peter_King_Jr_0001
Kishore_Prasad_Misra_1253
George_Floyd_21543
Veer_Venkata_Sai_Narsimha_Kishore_00015

我想在不同的列中获取名称和代码,但是分隔符“\”及其出现位置(count&position)在每一行或值中都不相同,如上所示。
那么如何从右边读取字符串并提取名称和代码,如下所示
要求的结果

Name                                    Code
---------------------------------------------
Saint_Peter_King_Jr                      0001
Kishore_Prasad_Misra                     1253
George_Floyd                            21543
Veer_Venkata_Sai_Narsimha_Kishore       00015

我试过了但是 instr 功能但是 INSTR( string, substring [, start_position [, th_appearance ] ] ) 但外观并不是一成不变的,而是根据名字而变化的。如何让它充满活力?

pgvzfuti

pgvzfuti1#

下面sql使用oracle内置函数instr和substr,并假定“code”始终是字符串的最后一部分,并且总是以一个下划线字符开头,即。 _ ```
select substr('Veer_Venkata_Sai_Narsimha_Kishore_00015',1,instr('Veer_Venkata_Sai_Narsimha_Kishore_00015','',-1) - 1) as NAME
,substr('Veer_Venkata_Sai_Narsimha_Kishore_00015',instr('Veer_Venkata_Sai_Narsimha_Kishore_00015','
',-1) + 1) as CODE
from dual

结果是。。。

NAME CODE


Veer_Venkata_Sai_Narsimha_Kishore 00015

请注意,您可以替换列名,即。 `Column_X` 对于字符串文本。
o4tp2gmn

o4tp2gmn2#

regexp\u substr方法。with语句只是设置数据,肉在select中。正则表达式处理动态的含义,即未知数量的代码字符和/或未知数量的代码数字。正则表达式中的括号定义捕获的组,并返回该组。对于名称,最后一个下划线前的一组字符,后跟一个或多个数字;对于代码,任何字符数和最后一个下划线后的一组或多个数字。

WITH tbl(column_X) AS (
  SELECT 'Saint_Peter_King_Jr_0001' FROM dual UNION ALL
  SELECT 'Kishore_Prasad_Misra_1253' FROM dual UNION ALL
  SELECT 'George_Floyd_21543' FROM dual UNION ALL
  SELECT 'Veer_Venkata_Sai_Narsimha_Kishore_00015' FROM dual
)
SELECT 
  REGEXP_SUBSTR(column_X, '(.*?)_\d+', 1, 1, NULL, 1) AS NAME,
  REGEXP_SUBSTR(column_X, '.*?_(\d+)', 1, 1, NULL, 1) AS code
FROM tbl;

NAME                                    CODE                                   
--------------------------------------- ---------------------------------------
Saint_Peter_King_Jr                     0001                                   
Kishore_Prasad_Misra                    1253                                   
George_Floyd                            21543                                  
Veer_Venkata_Sai_Narsimha_Kishore       00015                                  

4 rows selected.
piok6c0g

piok6c0g3#

你不能用内置函数来实现。您将不得不编写自己的函数来按程序处理它。

相关问题