SQL:基于特定单词的子字符串/修剪列值

SQL: Substring/Trim column values based on specific word

提问人:NEWBIE 提问时间:8/23/2022 最后编辑:MT0NEWBIE 更新时间:8/25/2022 访问量:113

问:

我有表A。如何修剪列 COND,以便值保留单词 ITEM 和后面的所有内容?我希望结果如表 B 所示:

表A

|ID   |                        COND                         |
|:--- |:----------------------------------------------------|
|1    |ITEM = 'B967','B677','O342'                          |
|2    |ITEM = 'J833','UR09','ILY7'                          |
|3    |ITEM = 'B967, OJ87'                                  |
|4    |(CATE = 'OBRT', 'TMPT') AND (ITEM = 'UR09','ILY7')   |
|5    |CATE='ONTE,PNTE,QSDW,RVCG' OR ITEM=J833              |

表B

|ID   |             COND          |
|:--- |:--------------------------|
|1    |ITEM = 'B967','B677','O342'|
|2    |ITEM = 'J833','UR09','ILY7'|
|3    |ITEM = 'B967, OJ87'        |
|4    |ITEM = 'UR09','ILY7')      |
|5    |ITEM=J833                  |
SQL 预言机

评论

0赞 Gary_W 8/25/2022
你不想要 ID 4 的结束语,是吗?
0赞 NEWBIE 8/25/2022
如果在最后的表格中也将其删除,那就太好了

答:

1赞 Isolated 8/23/2022 #1

您可以结合使用子字符串和内字符串。INSTR 将返回“ITEM”开始的位置,然后 SUBSTR 将返回该位置开始后的所有内容。

select id, cond, SUBSTR(cond, INSTR(cond, 'ITEM', 1)) as col_name
from my_table

输出:

编号 待续 COL_NAME
1 项目 = 'B967','B677','O342' 项目 = 'B967','B677','O342'
2 项目 = 'J833','UR09','ILY7' 项目 = 'J833','UR09','ILY7'
3 项目 ='B967, OJ87' 项目 ='B967, OJ87'
4 (CATE = 'OBRT', 'TMPT')和 (ITEM = 'UR09','ILY7') 项目 = 'UR09','ILY7')
5 CATE='ONTE,PNTE,QSDW,RVCG' 或 ITEM=J833 编号=J833

在这里找到 Db-fiddle。

评论

0赞 NEWBIE 8/23/2022
当我运行时,我收到错误消息:函数 INSTR() 的参数数量错误SELECT ID, COND, SUBSTR(COND, INSTR(COND, 'ITEM', 1)) AS COND1 FROM A
0赞 Isolated 8/23/2022
此查询会发生什么情况:select INSTR('ABC TRIM 444', 'TRIM', 1) from dual;
0赞 Gary_W 8/25/2022 #2

使用 REGEXP_SUBSTR() 将允许您捕获 ITEM 和直到最后一位数字字符或单个引号的所有内容(基于您的示例数据),从而消除 ID 4 中的结束部分。请注意REGEXP_SUBSTR会增加更多的开销,因此根据数据的大小,这可能没有那么有效。您的里程可能会有所不同。

WITH A(ID, cond) AS (
  SELECT 1, 'ITEM = ''B967'',''B677'',''O342''' FROM dual UNION ALL
  SELECT 2, 'ITEM = ''J833'',''UR09'',''ILY7''' FROM dual UNION ALL
  SELECT 3, 'ITEM = ''B967, OJ87'''             FROM dual UNION ALL
  SELECT 4, '(CATE = ''OBRT'', ''TMPT'') AND (ITEM = ''UR09'',''ILY7'')' FROM dual UNION ALL
  SELECT 5, 'CATE=''ONTE,PNTE,QSDW,RVCG'' OR ITEM=J833' FROM dual
)
SELECT ID, REGEXP_SUBSTR(cond, '(ITEM.*([[:digit:]]|''))') AS ITEM
from a;

   ID ITEM                                              

     1 ITEM = 'B967','B677','O342'                       
     2 ITEM = 'J833','UR09','ILY7'                       
     3 ITEM = 'B967, OJ87'                               
     4 ITEM = 'UR09','ILY7'                              
     5 ITEM=J833                                         

已选择 5 行。