Заменить функцию в SQL в IBMI для нескольких символов (из таблицы) - PullRequest
0 голосов
/ 27 августа 2018

У меня проблема с функцией замены в SQL. У меня есть таблица (Таблица A), которая имеет 2 поля (Original_Char и Replacement_char). Теперь для строки, которая есть в программе, я должен заменить каждый символ в поле Original_char на соответствующее поле Replacement_char.

Например, если у меня есть одна запись Original_char = 'A' и Replacement_Char = '%' и если моя строка - «Apple Ball», то ее следует заменить на «% pple B% ll». Теперь, если я добавлю еще одну запись сюда, Original_char = 'E' и Replacement_Char = '&', тогда моя строка будет ‘‘% ppl & B% ll ’’

Я пытался заменить функцию в SQL. Это будет работать с одной записью, но таблица A может иметь любое количество записей, и весь символ Original_char строки должен быть заменен на Replacement_char.

Использование запроса ниже даст мне несколько записей (Количество записей в таблице A)

SELECT                                         
replace('APPLE BALL',Original_char,replacement Char) FROM Table_A

результат будет

%PPLE B%LL 
APPL& BALL 

Единственный способ, о котором я могу думать, это навести курсор на Таблицу А, что было бы трудоемким занятием.

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Вложите функцию замены.

replace(
replace(
replace(mystring,'A','a')
,'B', 'b')
,'C,'c')
0 голосов
/ 29 августа 2018

СПАСИБО ... Поместите все 'Original_char' в одну строку (строка A) .. Используя функцию listagg. сделал то же самое с 'Replacement_char' (строка B) .. Теперь я просто использую% XLATE поверх моей строки, где мне нужно его изменить .. Я до сих пор не реализовал часть XLATE, но она должна работать

0 голосов
/ 27 августа 2018
SELECT                                         
replace('APPLE BALL',Original_char,replacement Char) FROM Table_A

Ваш код заменяет строку "APPLE BALL" для каждой строки в таблице A ... 1 раз замена А ->% 2 раза я заменяю B -> & но на исходную строку.

Вы должны разработать строку, после получения результата и разработать его снова ... ... Вам нужна итерация, может быть, вам поможет процедура.

Somenthing, как это:

CREATE PROCEDURE
    SCHEMA/PROCEDURE NAME
    (
    )
    LANGUAGE SQL
    SPECIFIC SCHEMA/PROCEDURE NAME
    NOT DETERMINISTIC
    MODIFIES SQL DATA

BEGIN
    DECLARE END_C1_SRS SMALLINT DEFAULT 0 ;
    DECLARE STRING_TO_MODIFY       CHAR(10) DEFAULT 'APPLE BALL' ;    

    DECLARE C1_SRS CURSOR FOR
    select replace(STRING_TO_MODIFY,Original_char,replacement Char) FROM Table_A

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET END_C1_SRS = -1 ;
    OPEN  C1_SRS ;
    SET END_C1_SRS = 0 ;
    FETCH_C1_SRS:
    LOOP

        FETCH C1_SRS
        INTO
        STRING_TO_MODIFY
        IF END_C1_SRS = -1 THEN
            LEAVE FETCH_C1_SRS ;
        END IF ;                                                        ) ;
    END LOOP FETCH_C1_SRS ;
    CLOSE C1_SRS ;
END ;
...