从一个减去的字符串列创建两个字符串列

时间:2013-10-17 13:36:16

标签: sql string oracle oracle11g

我有一个名为 lex 的表,其中包含一个名为CHARGE_CODE_DESCR的字符串列。

行包含具有以下结构的字符串:

USPOB000 - SMS usluga- Pobjeda
U211 - Video i Data pozivi
...
...

我想将第一个单词(在-之前)放入名为VALUE的列中,将所有其余单词(在-之后)放入名为TEXT的第二列。

例如,从前两行我想得到这些结果:

VALUE     TEXT
USPOB000  SMS usluga- Pobjeda
U211      Video i Data pozivi

为了得到我写这个查询的第一个字:

SELECT DISTINCT regexp_substr(CHARGE_CODE_DESCR,'\w+') as VALUE from lex

为了得到文本的其余部分,我写了这个查询:

SELECT DISTINCT SUBSTR(Text, 3, LENGTH(Text)) as TEXT
FROM
(
   select SUBSTR(CHARGE_CODE_DESCR, INSTR(CHARGE_CODE_DESCR, '- ')) as Text from lex
)

如何在一个查询中将它们组合在一起,以便从每行数据中创建所需的两列?

2 个答案:

答案 0 :(得分:2)

尝试以下解决方案:

WITH
  data AS
  (SELECT 'USPOB000 - SMS usluga- Pobjeda' AS str FROM dual
  UNION SELECT 'U211 - Video i Data pozivi' AS str FROM dual)
SELECT
    regexp_substr(str, '(.*?) -', 1, 1, NULL, 1) AS Value,
    regexp_substr(str, '- (.*)', 1, 1, NULL, 1) AS Text
  FROM data
;

想法是使用对匹配组的引用(regexp_substr的最后一个参数) - 1表示:'给我第一组中的任何内容,其中每个组通过被包含在集合中来识别或括弧'。我还使用了非贪婪*运算符(后跟问号?,因此*运算符不会吞下连字符-

Oracle documentation about regexp_substr

中了解详情

编辑:使用您的表格和列名:

SELECT DISTINCT
    regexp_substr(charge_code_descr, '(.*?) -', 1, 1, NULL, 1) AS Value,
    regexp_substr(charge_code_descr, '- (.*)', 1, 1, NULL, 1) AS Text
  FROM lex
;

答案 1 :(得分:2)

  

如何在一个查询中将它们组合在一起

这很简单。实际上不需要涉及正则表达式函数:

/* sample of data */
with t1( col) as(
  select 'USPOB000 - SMS usluga- Pobjeda' from dual union all
  select 'U211 - Video i Data pozivi'     from dual
)
/* actual query */
select substr(col, 1, instr(col, '-')-1) as val
     , substr(col, instr(col, '-') + 1)  as text
 from t1

结果:

VAL                            TEXT
------------------------------ ------------------------------
USPOB000                        SMS usluga- Pobjeda
U211                            Video i Data pozivi