Sql 检查字符串是否有特定的结尾,删除此结尾,然后根据其他两个条件写入这些字符串
我在从系统中准备可读报告时遇到问题 我必须从“sil.catalog_no”中提取字符串 首先,我必须检查字符串是否以“-UW”结尾并删除它 之后,我必须提取该字符串(已经没有-UW了),但是在第一个'-'或第二个'-'之前没有第一部分,这取决于在第一个'-'之前是否有'US' 我知道这很糟糕,但我不知道如何用另一种方式来描述它 我已经用CHARINDEX尝试了SUBSTRING、LEFT、RIGHT等,但我的程序/数据库/sql版本(?)似乎无法处理这些问题,除了上面提到的这些问题,我找不到任何其他解决方案。也许是因为我没有正确使用它们,我不知道 sil.catalog_no.中包含的字符串示例如下:Sql 检查字符串是否有特定的结尾,删除此结尾,然后根据其他两个条件写入这些字符串,sql,postgresql,Sql,Postgresql,我在从系统中准备可读报告时遇到问题 我必须从“sil.catalog_no”中提取字符串 首先,我必须检查字符串是否以“-UW”结尾并删除它 之后,我必须提取该字符串(已经没有-UW了),但是在第一个'-'或第二个'-'之前没有第一部分,这取决于在第一个'-'之前是否有'US' 我知道这很糟糕,但我不知道如何用另一种方式来描述它 我已经用CHARINDEX尝试了SUBSTRING、LEFT、RIGHT等,但我的程序/数据库/sql版本(?)似乎无法处理这些问题,除了上面提到的这些问题,我找不到任
HU-98010587
US-HU-88136FYT-719-UW
所以,在第一个例子中,我只需要检查末尾是否有“-UW”。没有,所以我转到第二步,只删除'HU-'并提取其余的'98010587'
对于第二个,我想检查并从末尾删除“-US”。然后我想删除整个“US-HU-”,因为首先是“US”,我想得到“88136FYT-719”
编辑:
在重新思考这个问题之后,我想我想知道如何擦除字符串的特定部分。查看我提供的图像,我想删除结果中出现的所有“HU-”、“EMC-”、“US-”和“-UW”。好的,我认为函数
regexp\u 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
我认为上面的两个正则表达式可能都得到正确的结果,而第二个正则表达式将精确地匹配您的需要。试试看。另一种方法(在Postgres上尝试过,但即使在没有正则表达式的地方也可以使用,比如SQLite3):
要了解您在编辑中所说的内容,我想删除结果中出现的所有“HU-”、“EMC-”、“US-”和“-UW”:
select s original,
replace(
replace(
replace(
replace(s,'HU-','')
,'US-','')
,'-UW','')
,'EMC-','') s
from t;
我认为函数
regexp\u replace
可以解决您的问题。所以您只想得到包含数字的列?注释不用于扩展讨论;这段对话已经结束。
select s original,
replace(
replace(
replace(
replace(s,'HU-','')
,'US-','')
,'-UW','')
,'EMC-','') s
from t;