从文本SQL

时间:2017-06-05 09:14:06

标签: sql oracle oracle11g

这是指先前其他人提出的问题 previous question

我的问题是如何调整此解决方案,以便在运行任何函数/脚本之前,名称和值字段将被删除任何其他+并更新,因此不会留下额外的+。

例如

Name     Value
A+B+C+   1+2+3+
A++B     1++2

这应该更新为

   Name     Value
    A+B+C   1+2+3
    A+B     1+2

更新完成后,我可以运行上一个问题中提供的解决方案。

由于

4 个答案:

答案 0 :(得分:2)

您需要将++替换为+并删除字符串末尾的+

/* sample data */
with input(Name, Value) as (
                            select 'A+B+C+'   ,'1+2+3+' from dual union all
                            select 'A++B'     ,'1++2'   from dual
                            )
/* query */
select trim('+' from regexp_replace(name,  '\+{2,}', '+') ) as name,
       trim('+' from regexp_replace(value, '\+{2,}', '+') ) as value
from input     

如果您需要更新表格,则可能需要:

update yourTable
set name = trim('+' from regexp_replace(name, '\+{2,}', '+') ),
    value= trim('+' from regexp_replace(value, '\+{2,}', '+') )

以更紧凑的方式,没有外部修剪(假设您没有前导+):

/* sample data */
with input(Name, Value) as (
                            select 'A+B+C+'      ,'1+2+3+' from dual union all
                            select 'A++B+++C+'   ,'1++2+++3+' from dual union all
                            select 'A+B'         ,'1+2'   from dual
                            )
/* query */
select regexp_replace(name,  '(\+)+(\+|$)', '\2') as name,
       regexp_replace(value, '(\+)+(\+|$)', '\2') as value
from input    

答案 1 :(得分:0)

您可以使用以下内容:

 Select substr('1+2+3+', 0, length('1+2+3+')-1) from dual ;
 Select replace('1++2', '++', '+') from dual;

我假设您的输出已存在于您可以使用的变量中。

编辑: 这是一个可以解决问题的函数(您可以在select子句中调用此函数,从而解决问题):

CREATE OR REPLACE Function ReplaceChars
    ( name_in IN varchar2 )
    RETURN varchar2
IS
    changed_string varchar2(20) ;
BEGIN

    changed_string:=replace(name_in, '++', '+') ;

    CASE WHEN substr(changed_string, -1) in ('+')
        then
            changed_string:=substr(changed_string,0, length(changed_string) - 1) ;
        else changed_string:=changed_string ;
    end CASE ;

    RETURN changed_string;
END;

答案 2 :(得分:0)

您可以使用以下内容:

LTRIM(RTRIM (REGEXP_REPLACE (column_name, '\+{2,}', '+'), '+'),'+')

例如:

    SELECT LTRIM(RTRIM (REGEXP_REPLACE ('+A+++B+C+++D++', '\+{2,}', '+'), '+'),'+') VALUE
  FROM DUAL;

返回输出:A+B+C+D

答案 3 :(得分:-1)

如果你正在使用ssms,给它一个GO :::

UPDATE tablename
SET colname= 
CASE colname WHEN LIKE '%++%' THEN
    WHILE colname LIKE '%++%'
        (REPLACE(colname,++,+))
    END LOOP

WHEN LIKE '%+' THEN
    SUBSTR(colname, 1, LENGTH(colname)-1)

WHEN LIKE '+%' THEN
    SUBSTR(colname, 2, LENGTH(colname))

ELSE
   colname
END