我有一列SKETCH,其中包含长度可变的向量字符串,如下所示:
“ R24U26L24(LD26)”
每个字符串包含某些字母,后跟一个数字,并且在任何错误旁都带有括号()。
我想找到每个向量字符串中的所有错误-又名。格式为%(LD%)%或%(L%D)%[%为通配符]的字符串的任何部分-删除错误周围的括号对以及其中没有数字的任何字母跟着它。
结果应类似于“ R24U26L24 D26 ”
我尝试结合使用UPDATE,CASE ELSE和REPLACE函数来运行我已经执行但未成功执行的不同错误标准。例如,我下面使用的代码将整个矢量字符串替换为“%D %%”作为文本。非常感谢您帮助解决此问题。
UPDATE table
SET sketch = CASE
WHEN sketch LIKE '%(LD%)%' THEN REPLACE(REPLACE('%(LD%)%', '(L', ''), ')', '')
WHEN sketch LIKE '%(RU%)%' THEN REPLACE(REPLACE('%(RU%)%', '(R', ''), ')', '')
WHEN sketch LIKE '%(L%U)%' THEN REPLACE(REPLACE('%(L%U)%', '(', ''), 'U)', '')
WHEN sketch LIKE '%(L%D)%' THEN REPLACE(REPLACE('%(L%D)%', '(', ''), 'D)', '')
ELSE sketch END;
编辑:这是我使用的最终修复。不像我希望的那样简洁,但是它可以工作:
UPDATE table
SET sketch = regexp_replace(sketch, '\(LD([0-9]*)\)','D\1', 'g');
UPDATE table
SET sketch = regexp_replace(sketch, '\(RU([0-9]*)\)','U\1', 'g');
UPDATE table
SET sketch = regexp_replace(sketch, '\(L([0-9]*)U\)','L\1', 'g');
UPDATE table
SET sketch = regexp_replace(sketch, '\(L([0-9]*)D\)','L\1', 'g');
答案 0 :(得分:1)
尝试一下:
UPDATE table_name
SET sketch = regexp_replace(sketch, '\(LD([0-9]*)\)','L\1');
UPDATE table_name
SET sketch = regexp_replace(sketch, '\(RU([0-9]*)\)','R\1');
UPDATE table_name
SET sketch = regexp_replace(sketch, '\(L([0-9]*)U\)','\1U');
UPDATE table_name
SET sketch = regexp_replace(sketch, '\(L([0-9]*)D\)','\1D');
您只需要一个查询,我想其中之一可能有效:
UPDATE table_name
SET sketch = (CASE
WHEN regexp_matches(sketch, '\(LD([0-9]*)\)') THEN regexp_replace(sketch, '\(LD([0-9]*)\)','L\1')
WHEN regexp_matches(sketch, '\(RU([0-9]*)\)') THEN regexp_replace(sketch, '\(RU([0-9]*)\)','R\1')
WHEN regexp_matches(sketch, '\(L([0-9]*)U\)') THEN regexp_replace(sketch, '\(L([0-9]*)U\)','\1U')
WHEN regexp_matches(sketch, '\(L([0-9]*)D\)') THEN regexp_replace(sketch, '\(L([0-9]*)D\)','\1D')
ELSE sketch END);
或
UPDATE table_name
SET sketch = (CASE
WHEN sketch ~* '\(LD([0-9]*)\)' THEN regexp_replace(sketch, '\(LD([0-9]*)\)','L\1')
WHEN sketch ~* '\(RU([0-9]*)\)' THEN regexp_replace(sketch, '\(RU([0-9]*)\)','R\1')
WHEN sketch ~* '\(L([0-9]*)U\)' THEN regexp_replace(sketch, '\(L([0-9]*)U\)','\1U')
WHEN sketch ~* '\(L([0-9]*)D\)' THEN regexp_replace(sketch, '\(L([0-9]*)D\)','\1D')
ELSE sketch END);