我有一个名为 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
)
如何在一个查询中将它们组合在一起,以便从每行数据中创建所需的两列?
答案 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