首页 > 解决方案 > 检查一个字符串是否有特定的结尾,删除这个结尾,然后根据其他两个条件写入这些字符串

问题描述

在此处输入图像描述在此处输入图像描述从我的系统准备可读报告时遇到问题。

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

标签: sqlpostgresql

解决方案


好的,我认为该功能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

我认为上面的两个正则表达式可能都会得到正确的结果,而第二个将准确地满足您的需求。就试一试吧。


推荐阅读