我必须从“ sil.catalog_no”中提取字符串。
首先,我必须检查字符串是否以'-UW'结尾,并将其删除。
在那之后,我必须提取该字符串(已经没有-UW了),但是在第一个“-”之前或第二个“-”之前没有第一部分的情况下,这取决于第一个“-”之前是否有“ US”。
我知道它搞砸了,但是我不知道如何用其他方式描述它。
我已经尝试过用CHARINDEX进行SUBSTRING,LEFT,RIGHT和其他操作,但是我的程序/数据库/ sql版本(?)似乎无法在这些内容上运行,并且除了上述这些,我找不到其他解决方案。也许是因为我不正确地使用它们,我不知道。
sil.catalog_no中包含的字符串示例为:
HU-98010587
US-HU-88136FYT-719-UW
因此,在第一个示例中,我只需要检查最后是否有“ -UW”。没有,所以我转到第二步,只删除“ HU-”并提取其余的“ 98010587”。
对于第二个,我想从最后检查并删除“ -US”。然后我想删除整个“ US-HU-”,因为首先是“ US”,我想得到“ 88136FYT-719”。
编辑:
重新思考问题之后,我想我想知道擦除字符串特定部分的方法。看我提供的图像,我想删除结果中出现的所有“ HU-”,“ EMC-”,“ US-”和“ -UW”。
答案 0 :(得分:2)
好的,我认为函数regexp_replace
可以解决您的问题。如下:
postgres=# select regexp_replace(regexp_replace('US-HU-88136FYT-719-UW','^([A-Z]+-)+',''),'(-[A-Z]+)+$','') as result;
result
--------------
88136FYT-719
(1 row)
postgres=# select regexp_replace(regexp_replace('HU-98010587','^([A-Z]+-)+',''),'(-[A-Z]+)+$','') as result;
result
----------
98010587
(1 row)
postgres=# select regexp_replace(regexp_replace('EMC-C13-PWR-7','^([A-Z]+-)+',''),'(-[A-Z]+)+$','') as result;
result
-----------
C13-PWR-7
或者我们更精确地删除'HU-', 'EMC-', 'US-', '-UW'
,如下所示:
postgres=# select regexp_replace(regexp_replace('HU-98010587','^(HU-|EMC-|US-)+',''),'(-UW)+$','') as result;
result
----------
98010587
(1 row)
postgres=# select regexp_replace(regexp_replace('US-HU-88136FYT-719-UW','^(HU-|EMC-|US-)+',''),'(-UW)+$','') as result;
result
--------------
88136FYT-719
(1 row)
postgres=# select regexp_replace(regexp_replace('EMC-C13-PWR-7','^(HU-|EMC-|US-)+',''),'(-UW)+$','') as result;
result
-----------
C13-PWR-7
(1 row)
postgres=# select regexp_replace(regexp_replace('US-HU-88134UGQ-UW','^(HU-|EMC-|US-)+',''),'(-UW)+$','') as result;
result
----------
88134UGQ
我认为上面的两个正则表达式都可以得到正确的结果,第二个正则表达式可以准确地满足您的需求。试试吧。
答案 1 :(得分:1)
另一种方法(在Postgres上尝试过,但即使在没有正则表达式的地方也可以使用,例如SQLite3):
drop table if exists t;
create table t(s varchar(30));
insert into t values
('HU-98010587'),
('US-HU-88136FYT-719-UW'),
('EMC-C13-PWR-7'),
('EMC-CTX-OM4-10M');
with xxx(original,s) as (
select s,substr(s,1,length(s)-3) from t where s like '%-UW'
union
select s,s from t where s not like '%-UW'
)
select original,substr(s,4) s from xxx where s like 'HU-%'
union
select original,substr(s,7) s from xxx where s like 'US-HU-%'
union
select original,s from xxx where s not like 'HU-%' and s not like 'US-HU-%';
要获得您在编辑I would like to erase all 'HU-', 'EMC-', 'US-', and '-UW' that appear in result
中所说的话:
select s original,
replace(
replace(
replace(
replace(s,'HU-','')
,'US-','')
,'-UW','')
,'EMC-','') s
from t;