Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 检查字符串是否有特定的结尾,删除此结尾,然后根据其他两个条件写入这些字符串_Sql_Postgresql - Fatal编程技术网

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

Sql 检查字符串是否有特定的结尾,删除此结尾,然后根据其他两个条件写入这些字符串,sql,postgresql,Sql,Postgresql,我在从系统中准备可读报告时遇到问题 我必须从“sil.catalog_no”中提取字符串 首先,我必须检查字符串是否以“-UW”结尾并删除它 之后,我必须提取该字符串(已经没有-UW了),但是在第一个'-'或第二个'-'之前没有第一部分,这取决于在第一个'-'之前是否有'US' 我知道这很糟糕,但我不知道如何用另一种方式来描述它 我已经用CHARINDEX尝试了SUBSTRING、LEFT、RIGHT等,但我的程序/数据库/sql版本(?)似乎无法处理这些问题,除了上面提到的这些问题,我找不到任

我在从系统中准备可读报告时遇到问题

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

好的,我认为函数
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;