Функция Pl / SQL возвращает строку с измененными символами - PullRequest
0 голосов
/ 06 февраля 2020

Как написать простую функцию, которая возвращает измененный параметр, чтобы он больше не содержал определенные символы?

(č=>c, ć=>c, š=>s, đ=>d, ž=>z..) e.g. *đurđević* => '*djurdjevic*' e.g. *kuća* => *kuca* e.g. *čaćkati* => *cackati*

У меня пока нет кода. Я очень новичок в этом и пытаюсь чему-то научиться.

Ответы [ 4 ]

0 голосов
/ 06 февраля 2020

Для хорватских символов вы можете использовать комбинацию TRANSLATE и REPLACE, поскольку TRANSLATE не поддерживает перевод один-ко-многим (например, đ => dj).

SELECT REPLACE(TRANSLATE('đak žvakaća čičak šuma','žćčš', 'zccs'), 'đ', 'dj') out FROM dual;

И вывод:

out
--------------------------
djak zvakaca cicak suma 

Редактировать

Итак, вот две функции-оболочки, которые реализуют эту функцию. Первый использует встроенные модули, в то время как другой имеет свою собственную реализацию.

-- first
CREATE OR REPLACE FUNCTION f_translate(p_string IN VARCHAR) 
RETURN VARCHAR 
AS
BEGIN
   RETURN REPLACE(TRANSLATE(p_string,'žćčš', 'zccs'), 'đ', 'dj');
END;

-- second
CREATE OR REPLACE FUNCTION f_translate_custom(p_string IN VARCHAR) 
RETURN VARCHAR 
AS
    v_current varchar(1);
    v_retval VARCHAR(255);
BEGIN
    FOR i IN 1..LENGTH(p_string) LOOP
        v_current := SUBSTR(p_string, i, 1);

        v_retval := v_retval || CASE v_current
                                    WHEN 'č'  THEN 'c'
                                    WHEN 'ć'  THEN 'c'
                                    WHEN 'ž'  THEN 'z'
                                    WHEN 'š'  THEN 's'
                                    WHEN 'đ'  THEN 'dj'
                                    ELSE v_current
                                END;                                
    END LOOP;

   RETURN v_retval;
END;

И некоторый тестовый код.

SET SERVEROUTPUT ON;
BEGIN
    DBMS_OUTPUT.PUT_LINE('Built-in: ' || f_translate('đak žvakaća čičak šuma'));

    DBMS_OUTPUT.PUT_LINE('Custom: ' || f_translate_custom('đak žvakaća čičak šuma'));

END;
0 голосов
/ 06 февраля 2020

Вы можете попробовать конвертировать функцию.

SELECT CONVERT('Ä Ê Í Õ Ø A B C D E ', 'US7ASCII', 'WE8ISO8859P1') 
   FROM DUAL; 

CONVERT('ÄÊÍÕØABCDE' 
--------------------- 
A E I ? ? A B C D E ? 
0 голосов
/ 06 февраля 2020

Это самое близкое, что вы можете получить, не создавая какую-либо структуру:

SELECT utl_raw.cast_to_varchar2((nlssort('čaćkati', 'nls_sort=binary_ai')))
FROM dual;

Если у вас много комбинаций, я предлагаю создать таблицу с возможными комбинациями и использовать функцию TRANSLATE.

0 голосов
/ 06 февраля 2020

Проверить перевод https://www.techonthenet.com/oracle/functions/translate.php

Пример:

TRANSLATE('1tech23', '123', '456')
Result: '4tech56'
...