例如,我有字符串'This Is An Example Of The String'
我想返回这个结果'This is an Example of the String'
==>我要所有的'Is','An‘'Of’和‘’在较低的情况下,其余的都应该留在英特卡普。
如何在一个简单而独特的查询中做到这一点?下面是我对小写的查询,只有'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 ;谢谢!
发布于 2010-11-26 14:30:31
试试这个:
SELECT REPLACE(REPLACE(REPLACE(REPLACE('This Is An Example Of The String', 'Of', 'of'), 'The', 'the'), 'An', 'an'), 'Is', 'is') FROM dual;不过,写完这封信后,我觉得有点脏。
编辑:删除额外的“an”替换,然后添加缩进,然后再删除缩进。不管你怎么包装,它看起来都很难看。
发布于 2010-11-26 14:31:55
从根本上讲,这需要你所描述的自然的许多逻辑。没有简单快捷的方法。您会发现,在业务逻辑代码中而不是在数据库中执行这种操作更快、更容易。
如果要在数据库中这样做,请考虑将逻辑封装在一个函数中,比如这一个。
发布于 2010-11-26 19:54:58
虽然它不是一个纯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‘例程不是我的--我在网上找到了它,我永远感激它是谁创造的。)
分享并享受。
https://stackoverflow.com/questions/4286068
复制相似问题