Oracle11g 如何从存储在| |中的oracle获取价值?

Oracle11g 如何从存储在| |中的oracle获取价值?,oracle11g,Oracle11g,我是oracle新手,我想从存储为“Ashu | | 123 | | |主菜单| ENG | | 1 |”的列中获取值。 正如您所看到的,每个值都由| |符号分隔。在上面的值中,Ashu是客户名称,123是id,我希望这两个值都作为客户名称和客户id。在下面的查询中,我包含一些“动态”测试数据(不是解决方案的一部分;在主查询中使用实际的表名而不是test_data,使用实际的列名而不是str)。为了确保查询在所有情况下都能正确工作,我包括了几个特殊情况进行测试。我假设第一个值(在第一个|之前)是

我是oracle新手,我想从存储为“Ashu | | 123 | | |主菜单| ENG | | 1 |”的列中获取值。
正如您所看到的,每个值都由| |符号分隔。在上面的值中,Ashu是客户名称,123是id,我希望这两个值都作为客户名称和客户id。

在下面的查询中,我包含一些“动态”测试数据(不是解决方案的一部分;在主查询中使用实际的表名而不是
test_data
,使用实际的列名而不是
str
)。为了确保查询在所有情况下都能正确工作,我包括了几个特殊情况进行测试。我假设第一个值(在第一个
|
之前)是客户名称,第二个是客户id,其余的输入字符串可以忽略。我特别查看了查询是否正确处理
null
值(假设它们可能发生在数据中)

我将客户id保留为字符串;如果它必须是一个数字,那么最好将其全部封装在
to_number()


谢谢你的回复,但看起来有点困难。我通过选择NVL(SUBSTR(uui,0,INSTR(uui,,| |')-1),uui)作为客户名称,REGEXP|u SUBSTR(uui,[^ | |]+',1,2)作为解决方案CustomerID@ashishjayara-如果您确定客户名称和客户id不能为
null
(不是现在,不是将来,两年后查询仍将使用),然后解决方案可以简化。是这样吗?解决方案“看起来有点困难”,因为它必须处理这种可能性。此外,如果您询问您不理解的部分,您可能会受益。是的,我现在知道了,谢谢:-)我对你的测试数据感到困惑,但我现在明白了,再次感谢
with
     test_data ( str ) as (
       select 'Ashu||123||Main Menu|ENG||1|1' from dual union all
       select 'Misha||125'                    from dual union all
       select 'Babu||||Main Menu|NZL||?'      from dual union all
       select 'Rim||'                         from dual union all
       select 'Todd'                          from dual union all
       select '||139||Other Stuff'            from dual
     )
-- end of test data (only for testing and illustration) - not part of solution
-- SQL query begins BELOW THIS LINE
select str,
       regexp_substr(str, '([^|]*)(\|\||$)', 1, 1, null, 1) as cust_name,
       regexp_substr(str, '([^|]*)(\|\||$)', 1, 2, null, 1) as cust_id
from test_data
;

  STR                            CUST_NAME  CUST_ID
  -----------------------------  ---------  -------
  Ashu||123||Main Menu|ENG||1|1  Ashu       123
  Misha||125                     Misha      125
  Babu||||Main Menu|NZL||?       Babu
  Rim||                          Rim
  Todd                           Todd
  ||139||Other Stuff                        139

  6 rows selected.