首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -处理字符串

SQL -处理字符串
EN

Stack Overflow用户
提问于 2010-11-26 14:23:13
回答 4查看 354关注 0票数 1

例如,我有字符串'This Is An Example Of The String'

我想返回这个结果'This is an Example of the String'

==>我要所有的'Is','An‘'Of’和‘’在较低的情况下,其余的都应该留在英特卡普。

如何在一个简单而独特的查询中做到这一点?下面是我对小写的查询,只有'Of‘:

代码语言:javascript
复制
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 ;

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-26 14:30:31

试试这个:

代码语言:javascript
复制
SELECT REPLACE(REPLACE(REPLACE(REPLACE('This Is An Example Of The String', 'Of', 'of'), 'The', 'the'), 'An', 'an'), 'Is', 'is')    FROM dual;

不过,写完这封信后,我觉得有点脏。

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

票数 4
EN

Stack Overflow用户

发布于 2010-11-26 14:31:55

从根本上讲,这需要你所描述的自然的许多逻辑。没有简单快捷的方法。您会发现,在业务逻辑代码中而不是在数据库中执行这种操作更快、更容易。

如果要在数据库中这样做,请考虑将逻辑封装在一个函数中,比如这一个

票数 2
EN

Stack Overflow用户

发布于 2010-11-26 19:54:58

虽然它不是一个纯SQL解决方案,但另一个选项是定义一个函数,该函数按需要转换字符串,也许称之为REPLACE_MULTI。调用应该类似于

代码语言:javascript
复制
SELECT REPLACE_MULTI('This Is An Example Of The String',
                     'Is|An|Of|The',
                     'is|an|of|the')
  FROM DUAL;

而实现则是类似于

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4286068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档