尝试更新SQL中的子字符串

问题描述 投票:0回答:1

任何人都可以提供某些SQL语法的帮助吗?

我有一个表(TABLE A),其中包含54个字符的字段(FIELD A),其本质上包含8x6的数据块。这些可以分解为子字符串:

  • substr(FIELD A,1,6)as A
  • substr(FIELD A,7,6)as B
  • substr(FIELD A,13,6)as C
  • substr(FIELD A,19,6)as D
  • substr(FIELD A,25,6)as E
  • substr(FIELD A,31,6)as F
  • substr(FIELD A,37,6)as G
  • substr(FIELD A,43,6)为H
  • substr(FIELD A,49,6)as I

我需要做的是,如果这些子字符串字段(A到I)中的任何一个出现'404040',请将其替换为'000000'。 '404040'必须处于这些确切位置,而不仅仅是FIELD A中任何位置的'like%404040%'。我认为我无法对子字符串(?)执行更新,但是我在使用Replace Haven的努力还没有工作。谁能提出解决方案?我正在使用SQL Developer 3.2.20.10和Oracle 12。

非常感谢AP

sql oracle12c
1个回答
0
投票

您可以使用两个函数Replacepos替换位置处的字符串,并使用replacepos1提及要替换的no_of_chars。之后,您可以使用下面的SQL来实现此功能

            WITH data
         AS (SELECT ROWNUM                       rw,
                    Lpad('404040', 54, '404040') A
             FROM   dual),
         d1
         AS (SELECT rw,
                    Decode(Instr(a, '404040', 1), 1, Replacepos1(a, '0', 1, 6)) A
             FROM   data),
         d2
         AS (SELECT rw,
                    Decode(Instr(a, '404040', 1), 7, Replacepos1(a, '0', 7, 6)) A
             FROM   d1),
         d3
         AS (SELECT rw,
                    Decode(Instr(a, '404040', 1), 13, Replacepos1(a, '0', 13, 6))A
             FROM   d2),
         d4
         AS (SELECT rw,
                    Decode(Instr(a, '404040', 1), 19, Replacepos1(a, '0', 19, 6))A
             FROM   d3),
         d5
         AS (SELECT rw,
                    Decode(Instr(a, '404040', 1), 25, Replacepos1(a, '0', 25, 6))A
             FROM   d4),
         d6
         AS (SELECT rw,
                    Decode(Instr(a, '404040', 1), 31, Replacepos1(a, '0', 31, 6))A
             FROM   d5),
         d7
         AS (SELECT rw,
                    Decode(Instr(a, '404040', 1), 37, Replacepos1(a, '0', 37, 6))A
             FROM   d6),
         d8
         AS (SELECT rw,
                    Decode(Instr(a, '404040', 1), 43, Replacepos1(a, '0', 43, 6))A
             FROM   d7),
         d9
         AS (SELECT rw,
                    Decode(Instr(a, '404040', 1), 49, Replacepos1(a, '0', 49, 6))A
             FROM   d8)
    SELECT A
    FROM   d9;

下面的功能规格

   CREATE OR replace FUNCTION Replacepos(source_in      IN VARCHAR2,
                                          replacechar_in IN VARCHAR2,
                                          position_start IN NUMBER)
    RETURN VARCHAR2
    IS
      l_returnvalue VARCHAR2(32767);
      position_in   NUMBER;
    BEGIN
        -- copy from the source string up to, but not including,  
        -- the character position  
        position_in := position_start;

        -- to be replaced  
        l_returnvalue := Substr(str1 => source_in, pos => 1, len => position_in - 1)
        ;

        -- add the replacement character  
        -- just a single character, but more can be sent in,  
        -- so substring the parameter  
        l_returnvalue := l_returnvalue
                         || Substr(str1 => replacechar_in, pos => 1, len => 1);

        -- copy the rest of the source string  
        l_returnvalue := l_returnvalue
                         || Substr(str1 => source_in, pos => position_in + 1);

        RETURN l_returnvalue;
    END replacepos;

和以下功能

    CREATE OR replace FUNCTION Replacepos1 (source_in      IN VARCHAR2,
                                            replacechar_in IN VARCHAR2,
                                            position_start IN NUMBER,
                                            no_of_chars    IN NUMBER)
    RETURN VARCHAR2
    IS
      l_returnvalue VARCHAR2(32767);
      position_in   NUMBER;
    BEGIN
        l_returnvalue := source_in;

        FOR i IN 1..no_of_chars LOOP
            l_returnvalue := Replacepos(l_returnvalue, replacechar_in,
                             position_start + i - 1);
        END LOOP;
© www.soinside.com 2019 - 2024. All rights reserved.