【问题标题】:Create two string columns from one string column that was subtracted从减去的一个字符串列创建两个字符串列
【发布时间】:2013-10-17 21:49:23
【问题描述】:

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

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

【问题讨论】:

    标签: sql string oracle oracle11g


    【解决方案1】:

    如何将它们结合到一个查询中

    就这么简单。真的不需要涉及正则表达式函数:

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

      【讨论】:

      • 这适用于两个特定的数据行,但是如何将我的查询与此结合起来?
      • 我不确定我是否理解问题所在 - 只需将您的表 lex 放在 FROM 子句中,然后从我的示例中删除 WITH 子句。
      猜你喜欢
      • 2021-12-22
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 2016-07-10
      • 1970-01-01
      相关资源
      最近更新 更多