【问题标题】:Looking for SQL query to split the value into another column寻找 SQL 查询以将值拆分到另一列
【发布时间】:2018-04-26 00:58:36
【问题描述】:

我正在使用下面的 SQL 代码将一列的值拆分为另一列,但它没有按我预期的方式工作。请找到下面的代码以及我得到的输出。

查询:

select 
upper(regexp_replace(regexp_substr(db_attributes,'.([^\.-]+),([^\,-]+), ([^\,-]+)[so]?[\,-]',1,1,'i',1),'[so]$','') ) AS servername, db_attributes
from table_name

电流输出:

servername                  db_attributes
HSBC                        bsprod04.hbtr.adroot.hsbc, 49465, BSPROD04\PTRFRDS01
NULL                        hkw00100308c01.hbap.adroot.hsbc, 2433, HKW00100308C01
NULL                        ora-abacogp.de.hsbc, 1626, ABACOGP

期望的输出:

servername                  db_attributes
BSPROD04\PTRFRDS01          bsprod04.hbtr.adroot.hsbc, 49465, BSPROD04\PTRFRDS01
HKW00100308C01              hkw00100308c01.hbap.adroot.hsbc, 2433, HKW00100308C01
ABACOGP                     ora-abacogp.de.hsbc, 1626, ABACOGP

问候。

【问题讨论】:

  • 请给出table_name表的内容。
  • @Dominique 表的列名为“db_attributes”,其中包含所有服务器信息,所以我想将“db_attributes”列的最终值拆分为一个名为“servername”的新列,并且希望看到上面提到的输出。
  • 正则表达式会比SUBSTRINSTR慢很多。
  • @MT0,在一个有 3 条记录的表中,它不会有太大的区别。此外,假设表中有 100,000 多条记录...与 substrinstr 调用的组合相比,单个 regexp_substr 调用(每条记录)要慢多少?跨度>
  • @PeterAbolins stackoverflow.com/a/41166356/1509264 那里的测试表明正则表达式可能比字符串函数慢 40 倍。

标签: sql oracle


【解决方案1】:

基本上,如果服务器名称始终是属性(逗号分隔)列表中的最后一个值,则根本不用费心查看其余属性。

SELECT 
      upper(regexp_substr(db_attributes, '[^,]+$',1,1)) AS servername
    , db_attributes
FROM
    tablename

更新

如果你想测试它,这里是SQLFiddle link

【讨论】:

    【解决方案2】:

    SQL Fiddle

    Oracle 11g R2 架构设置

    CREATE TABLE table_name ( db_attributes ) AS
    SELECT 'bsprod04.hbtr.adroot.hsbc, 49465, BSPROD04\PTRFRDS01' FROM DUAL UNION ALL
    SELECT 'hkw00100308c01.hbap.adroot.hsbc, 2433, HKW00100308C01' FROM DUAL UNION ALL
    SELECT 'ora-abacogp.de.hsbc, 1626, ABACOGP' FROM DUAL
    

    查询 1

    SELECT REGEXP_SUBSTR( db_attributes, '\S+$' ) AS servername,
           db_attributes
    FROM   table_name
    

    Results

    |         SERVERNAME |                                         DB_ATTRIBUTES |
    |--------------------|-------------------------------------------------------|
    | BSPROD04\PTRFRDS01 |  bsprod04.hbtr.adroot.hsbc, 49465, BSPROD04\PTRFRDS01 |
    |     HKW00100308C01 | hkw00100308c01.hbap.adroot.hsbc, 2433, HKW00100308C01 |
    |            ABACOGP |                    ora-abacogp.de.hsbc, 1626, ABACOGP |
    

    查询 2

    SELECT SUBSTR( db_attributes, INSTR( db_attributes, ' ', -1 ) + 1 ) AS servername,
           db_attributes
    FROM   table_name
    

    Results

    |         SERVERNAME |                                         DB_ATTRIBUTES |
    |--------------------|-------------------------------------------------------|
    | BSPROD04\PTRFRDS01 |  bsprod04.hbtr.adroot.hsbc, 49465, BSPROD04\PTRFRDS01 |
    |     HKW00100308C01 | hkw00100308c01.hbap.adroot.hsbc, 2433, HKW00100308C01 |
    |            ABACOGP |                    ora-abacogp.de.hsbc, 1626, ABACOGP |
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多