2

我有一个名为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
)

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

4

2 回答 2

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 文档中阅读有关 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
;
于 2013-10-17T13:41:12.707 回答
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
于 2013-10-17T13:43:23.013 回答