代码之家  ›  专栏  ›  技术社区  ›  mcha

SQL-处理字符串

  •  1
  • mcha  · 技术社区  · 14 年前

    例如,我有一个字符串 'This Is An Example Of The String'
    我想返回这个结果 'This is an Example of the String'
    ==>我想要所有的 ', ' 一个 ' ' '和' 这个 “在较低的情况下,其余的应该留在Initcap中。

    如何在一个简单且唯一的查询中实现这一点?这是我对小写的问题 ' :

    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 回复  |  直到 14 年前
        1
  •  4
  •   JonVD    14 年前

    试试这个:

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

    写了那篇文章之后我觉得有点脏。

    编辑:删除多余的“an”替换,然后添加缩进,然后再次删除缩进。不管你怎么包装,它看起来都很难看。

        2
  •  2
  •   Timbo    14 年前

    基本上这需要很多你描述的自然逻辑。没有捷径可走。您会发现在业务逻辑代码中而不是在数据库中进行这种操作更快、更容易。

    如果要在数据库中执行此操作,请考虑将逻辑包装到函数中,如 this one .

        3
  •  2
  •   Bob Jarvis - Слава Україні    14 年前

    尽管它不是一个纯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;
    

    我确信可以创建一些令牌字符串,这些字符串将破坏基于正则表达式的解析(尝试在其中放置一个“^”或“$”,并观察火花飞扬:-),但这对于最初的黑客攻击来说已经足够了。

    (顺便说一句,“提取代币”的程序不是我的——我不久前在网上找到了它,我永远感激创造这个程序的人)。

    分享和享受。

        4
  •  0
  •   Ahmad Farid    14 年前

    我可以告诉你算法,但我不知道如何在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