正则表达式
Regular Expression
我发现了我的错误!!!这是错误的CASE WHEN regexp_substr(artikel.abez1,'[^/]*$') AS download,
我刚刚删除了 'Case when',它起作用了!谢谢大家! :)
我有这个数据:
DE-Internet-LTE
AE-Internet-Ethernet-10M/30M
如何只获取值“10M”?如果有 none,我希望它 return 为 null。
我使用了这个查询:
regexp_substr(artikel.abez1,'[^-/]*$') AS upload
在第二行,它给出结果“10M”,但在第一行,它return为“LTE”而不是“null”。
我正在使用 SQL 工具 1.8 b38。
更新:
我的完整查询:
`
SELECT DISTINCT artikel.artnr1, L1.lfnr1 AS lfnr, L1.name1 AS lf_name,
artikel.abez1, regexp_substr(artikel.abez1,'(.?){1}(.?)-', 1, 1, '',
2) AS land, regexp_substr(artikel.abez1,'(.?-){1}(.?)-', 1, 1, '',
2) AS Technologie, CASE WHEN
regexp_substr(artikel.abez1,'(.?-){2}(.?)-', 1, 1, '', 2) IS NULL
THEN regexp_substr(artikel.abez1,'[^-]$') ELSE
regexp_substr(artikel.abez1,'(.?-){2}(.?)-', 1, 1, '', 2) END AS
Topologie, regexp_substr(regexp_substr(artikel.abez1,
'([^-/]+)/[^-/]+$'), '^[^-/]+') AS upload, CASE WHEN
regexp_substr(artikel.abez1,'[^/]$') AS download,
bestanfragepos.preis / bestanfrage.bwkurs, 'Anfrage' AS Art,
To_Char(bestanfrage.lfdanfrage), bestanfrage.anfragedatum, CASE WHEN
InStr(angaufgut.reserve1, '.') > 1 THEN Months_Between(
bestanfrage.anfragedatum, To_Date(angaufgut.reserve1)) ELSE
To_Number(angaufgut.reserve1) end AS Laufzeit FROM artikel inner join
modell ON modell.lfdnr = artikel.lfdmodnr left join bestanfragepos ON
artikel.lfdnr = bestanfragepos.lfdartnr left join bestanfrage ON
bestanfragepos.lfdanfrage = bestanfrage.lfdanfrage left join lieferant
L1 ON L1.liefnr = bestanfrage.lfdliefnr left JOIN angaufgut ON
bestanfragepos.lfdangaufgutnr = angaufgut.lfdnr WHERE Lower(modcode)
LIKE 'ac%' AND Lower(abez1) NOT LIKE 'cust%' and artikel.mandant = 1
AND bestanfragepos.preis != 0 ORDER BY abez1 /
`
它给出错误 ora-00920 无效的关系运算符。
当我使用这个时,它只对单个数据有效:
SELECT regexp_substr(regexp_substr(artikelbez, '([^-/]+)/[^-/]+$'), '^[^-/]+') FROM nag_reporting_leitungspreise WHERE art = 'Vertrag' AND REF = 3791
你的代码returns 30M。如果你真的想要 10M,那么这应该做你想要的:
select regexp_substr(regexp_substr(t.abez1, '([^-/]+)/[^-/]+$'), '^[^-/]+') AS upload
from t;
Here 是一个 db<>fiddle.
with t(str) as (
select * from table(ku$_vcnt(
'DE-Internet-LTE',
'AE-Internet-Ethernet-10M/30M',
'AE-Internet-Ethernet-20m/40m',
'AE-Internet-Ethernet-300M/500M',
'AE-Internet-Ethernet-4000k/600k',
'AE-Internet-Ethernet-200M'
))
)
select
str,
regexp_substr(str, '(\d+(k|m))(/\d+(k|m))?',1,1,'i',1) upload,
regexp_substr(str, '/(\d+(k|m))',1,1,'i',1) download
from t;
结果:
STR UPLOAD DOWNLOAD
----------------------------------- ------- --------
DE-Internet-LTE
AE-Internet-Ethernet-10M/30M 10M 30M
AE-Internet-Ethernet-20m/40m 20m 40m
AE-Internet-Ethernet-300M/500M 300M 500M
AE-Internet-Ethernet-4000k/600k 4000k 600k
AE-Internet-Ethernet-200M 200M
看看下面的解决方案:
with t(str) as
(
select column_value
from table(sys.odcivarchar2list(
'DE-Internet-LTE',
'AE-Internet-Ethernet-10M/30M',
'AE-Internet-Ethernet-20m/40m',
'AE-Internet-Ethernet-300M/500M',
'AE-Internet-Ethernet-4000k/600k',
'AE-Internet-Ethernet-200M'
))
)
select str,
regexp_substr(str, '-(\d+.*?)(/|$)',1,1,null,1) as upload,
regexp_substr(str, '/(\d+.*?)$',1,1,null,1) as download,
regexp_substr(regexp_substr(str, '([^-/]+)/[^-/]+$'), '^[^-/]+') as Gordan_Linoff_upload
from t;
输出:
我发现了我的错误!!!这是错误的CASE WHEN regexp_substr(artikel.abez1,'[^/]*$') AS download,
我刚刚删除了 'Case when',它起作用了!谢谢大家! :)
我有这个数据:
DE-Internet-LTE
AE-Internet-Ethernet-10M/30M
如何只获取值“10M”?如果有 none,我希望它 return 为 null。
我使用了这个查询:
regexp_substr(artikel.abez1,'[^-/]*$') AS upload
在第二行,它给出结果“10M”,但在第一行,它return为“LTE”而不是“null”。
我正在使用 SQL 工具 1.8 b38。
更新: 我的完整查询: `
SELECT DISTINCT artikel.artnr1, L1.lfnr1 AS lfnr, L1.name1 AS lf_name, artikel.abez1, regexp_substr(artikel.abez1,'(.?){1}(.?)-', 1, 1, '', 2) AS land, regexp_substr(artikel.abez1,'(.?-){1}(.?)-', 1, 1, '', 2) AS Technologie, CASE WHEN regexp_substr(artikel.abez1,'(.?-){2}(.?)-', 1, 1, '', 2) IS NULL THEN regexp_substr(artikel.abez1,'[^-]$') ELSE regexp_substr(artikel.abez1,'(.?-){2}(.?)-', 1, 1, '', 2) END AS Topologie, regexp_substr(regexp_substr(artikel.abez1, '([^-/]+)/[^-/]+$'), '^[^-/]+') AS upload, CASE WHEN regexp_substr(artikel.abez1,'[^/]$') AS download, bestanfragepos.preis / bestanfrage.bwkurs, 'Anfrage' AS Art, To_Char(bestanfrage.lfdanfrage), bestanfrage.anfragedatum, CASE WHEN InStr(angaufgut.reserve1, '.') > 1 THEN Months_Between( bestanfrage.anfragedatum, To_Date(angaufgut.reserve1)) ELSE To_Number(angaufgut.reserve1) end AS Laufzeit FROM artikel inner join modell ON modell.lfdnr = artikel.lfdmodnr left join bestanfragepos ON artikel.lfdnr = bestanfragepos.lfdartnr left join bestanfrage ON bestanfragepos.lfdanfrage = bestanfrage.lfdanfrage left join lieferant L1 ON L1.liefnr = bestanfrage.lfdliefnr left JOIN angaufgut ON bestanfragepos.lfdangaufgutnr = angaufgut.lfdnr WHERE Lower(modcode) LIKE 'ac%' AND Lower(abez1) NOT LIKE 'cust%' and artikel.mandant = 1 AND bestanfragepos.preis != 0 ORDER BY abez1 /
`
它给出错误 ora-00920 无效的关系运算符。
当我使用这个时,它只对单个数据有效:
SELECT regexp_substr(regexp_substr(artikelbez, '([^-/]+)/[^-/]+$'), '^[^-/]+') FROM nag_reporting_leitungspreise WHERE art = 'Vertrag' AND REF = 3791
你的代码returns 30M。如果你真的想要 10M,那么这应该做你想要的:
select regexp_substr(regexp_substr(t.abez1, '([^-/]+)/[^-/]+$'), '^[^-/]+') AS upload
from t;
Here 是一个 db<>fiddle.
with t(str) as (
select * from table(ku$_vcnt(
'DE-Internet-LTE',
'AE-Internet-Ethernet-10M/30M',
'AE-Internet-Ethernet-20m/40m',
'AE-Internet-Ethernet-300M/500M',
'AE-Internet-Ethernet-4000k/600k',
'AE-Internet-Ethernet-200M'
))
)
select
str,
regexp_substr(str, '(\d+(k|m))(/\d+(k|m))?',1,1,'i',1) upload,
regexp_substr(str, '/(\d+(k|m))',1,1,'i',1) download
from t;
结果:
STR UPLOAD DOWNLOAD
----------------------------------- ------- --------
DE-Internet-LTE
AE-Internet-Ethernet-10M/30M 10M 30M
AE-Internet-Ethernet-20m/40m 20m 40m
AE-Internet-Ethernet-300M/500M 300M 500M
AE-Internet-Ethernet-4000k/600k 4000k 600k
AE-Internet-Ethernet-200M 200M
看看下面的解决方案:
with t(str) as
(
select column_value
from table(sys.odcivarchar2list(
'DE-Internet-LTE',
'AE-Internet-Ethernet-10M/30M',
'AE-Internet-Ethernet-20m/40m',
'AE-Internet-Ethernet-300M/500M',
'AE-Internet-Ethernet-4000k/600k',
'AE-Internet-Ethernet-200M'
))
)
select str,
regexp_substr(str, '-(\d+.*?)(/|$)',1,1,null,1) as upload,
regexp_substr(str, '/(\d+.*?)$',1,1,null,1) as download,
regexp_substr(regexp_substr(str, '([^-/]+)/[^-/]+$'), '^[^-/]+') as Gordan_Linoff_upload
from t;
输出: