正则表达式

Regular Expression

我发现了我的错误!!!这是错误的CASE WHEN regexp_substr(artikel.abez1,'[^/]*$') AS download,

我刚刚删除了 'Case when',它起作用了!谢谢大家! :)

我有这个数据:

  1. DE-Internet-LTE

  2. 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;

输出: