我正在使用下面的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
问候。
答案 0 :(得分:0)
基本上,如果服务器名称始终是属性(逗号分隔)列表中的最后一个值,那么根本不需要查看其余属性。
SELECT
upper(regexp_substr(db_attributes, '[^,]+$',1,1)) AS servername
, db_attributes
FROM
tablename
<强>更新强>
而且,如果你想测试它,这里是SQLFiddle link。
答案 1 :(得分:0)
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 |