2013-10-17 81 views
2

我有一个名为lex的表,其字符串列名为CHARGE_CODE_DESCR从一个被扣除的字符串列中创建两个字符串列

该行包括字符串的这种结构:

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

我要采取的第一个字(在-之前)到一个名为值列和的话所有的休息(在-后)成第二列名为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

我怎么能在一个查询

像这样简单结合他们俩。实在是没有必要让正则表达式函数:

/* 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 
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 
; 
+0

这是工作数据的两个特定行,但我怎么能结合自己的查询与此? –

+0

我不知道我明白了什么问题 - 只需将'lex'放在'FROM'子句中,并从我的示例中删除'WITH'子句。 –

+0

啊,你了......谢谢。 –

相关问题