SQL - обработка строки - PullRequest
       7

SQL - обработка строки

1 голос
/ 26 ноября 2010

например, у меня есть строка 'This Is An Example Of The String'
и я хочу вернуть этот результат 'This is an Example of the String'
==> Мне нужны все ' Is ', ' An ' ' Of ' и ' ' в нижнем регистре Остальные должны остаться в Initcap.

Как это можно сделать в простом и уникальном запросе? вот мой запрос в нижнем регистре только ' Of ':

SELECT 'This Is An Example Of The String',
       CASE
         WHEN 'This Is An Example Of The String' like '% Of %'
         THEN replace('This Is An Example Of The String', ' Of ', ' of ')
       END
  FROM dual ;

Спасибо!

Ответы [ 4 ]

4 голосов
/ 26 ноября 2010

Попробуйте:

SELECT REPLACE(REPLACE(REPLACE(REPLACE('This Is An Example Of The String', 'Of', 'of'), 'The', 'the'), 'An', 'an'), 'Is', 'is')    FROM dual;

Хотя после написания этого письма я чувствую себя немного грязным.

Редактировать: Удалена дополнительная замена 'an', затем добавлен отступ, затем снова удален отступ.Это выглядит некрасиво, независимо от того, как вы его завернули.

2 голосов
/ 26 ноября 2010

Хотя это не чисто SQL-решение, другим вариантом будет определение функции, которая преобразует строку по желанию, возможно, вызывая ее REPLACE_MULTI. Вызов будет что-то вроде

SELECT REPLACE_MULTI('This Is An Example Of The String',
                     'Is|An|Of|The',
                     'is|an|of|the')
  FROM DUAL;

и реализация будет что-то вроде

CREATE OR REPLACE FUNCTION REPLACE_MULTI(strOriginal           IN VARCHAR2,
                                         strTokens_to_replace  IN VARCHAR2,
                                         strReplacement_tokens IN VARCHAR2)
  RETURN VARCHAR2
IS
  strResult             VARCHAR2(2000);
  arrTokens_to_replace  DBMS_SQL.VARCHAR2A;
  arrReplacement_tokens DBMS_SQL.VARCHAR2A;
  i                     NUMBER;

  FUNCTION extract_tokens(p_string IN VARCHAR2,
                          p_separators IN VARCHAR2) RETURN DBMS_SQL.VARCHAR2A
  IS
    arrTokens DBMS_SQL.VARCHAR2A;
  BEGIN
    WITH sel_string AS 
        (SELECT p_string AS fullstring FROM DUAL)
    SELECT SUBSTR(fullstring, beg + 1, end_p - beg - 1) AS token
      BULK COLLECT INTO arrTokens
      FROM (SELECT beg, LEAD(beg) OVER (ORDER BY beg) AS end_p, fullstring
              FROM (SELECT beg, fullstring
                      FROM (SELECT LEVEL beg, fullstring
                              FROM sel_string
                              CONNECT BY LEVEL <= LENGTH(fullstring))
                      WHERE INSTR(p_separators, SUBSTR(fullstring, beg, 1)) > 0
                    UNION ALL
                      SELECT 0, fullstring FROM sel_string
                    UNION ALL
                      SELECT LENGTH(fullstring) + 1, fullstring FROM sel_string))
      WHERE end_p IS NOT NULL AND
            end_p > beg + 1;

    RETURN arrTokens;
  END extract_tokens;

BEGIN
  arrTokens_to_replace := extract_tokens(strTokens_to_replace, '|');
  arrReplacement_tokens := extract_tokens(strReplacement_tokens, '|');

  strResult := strOriginal;

  FOR i IN 1..arrTokens_to_replace.COUNT LOOP
    strResult := REGEXP_REPLACE(strResult,
                                '^' || arrTokens_to_replace(i) || ' ', 
                                arrReplacement_tokens(i));
    strResult := REPLACE(strResult,
                         ' ' || arrTokens_to_replace(i) || ' ',
                         ' ' || arrTokens_to_replace(i) || ' ');
    strResult := REGEXP_REPLACE(strResult,
                                ' ' || arrTokens_to_replace(i) || '$',
                                ' ' || arrReplacement_tokens(i));
  END LOOP;

  RETURN strResult;
END REPLACE_MULTI;

Я уверен, что есть строки токенов, которые можно создать, которые прервут синтаксический анализ на основе регулярных выражений (попробуйте ввести '^' или '$' и посмотреть, как летят искры :-), но это хорошо достаточно для первоначального взлома.

(Кстати, рутина 'extract_tokens' не моя - я нашел ее в Интернете некоторое время назад и вечно благодарен тому, кто это создал).

Делись и наслаждайся.

2 голосов
/ 26 ноября 2010

В основном это займет много логики природы, которую вы описали. Там нет быстрого и легкого пути. Вам будет проще и быстрее выполнять этот тип манипуляции в коде бизнес-логики, а не в базе данных.

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

0 голосов
/ 26 ноября 2010

Я могу рассказать вам алгоритм, но я не уверен, как это сделать в SQL.например:

words[] = string.split(" ")
foreach word in words
---if(word.length<=3) //do that only for short words
-------if(word[i]>=65 && word[i]<=90) //check the ascii code for upper case
------------word[i] += 21; // transfer it into lower case
---new sentence += " " + words[i] //add to the resultant string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...