检查字符串是否具有特定的结尾,删除该结尾,然后根据其他两个条件写那些字符串

时间:2019-05-30 08:05:56

标签: sql postgresql

enter image description here enter image description here我在从系统准备可读报告时遇到问题。

我必须从“ 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”。

2 个答案:

答案 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;