Sql高级替换

时间:2014-03-18 18:40:56

标签: string replace

我必须做一个难以处理的文字。如何动态更改,如下例所示?

示例:/ hello / baby / deneme / / hello2 /

输出:(/ hello /)baby(/ deneme /)(/ hello2 /)

1 个答案:

答案 0 :(得分:0)

这是一个非常基本的解决方案,但它适用于你给出的案例(SQL Fiddle here):

SELECT
  in_str,
  (
    -- If the string starts with '/', prepend '('
    CASE WHEN in_str LIKE '/%' THEN '(' ELSE '' END
    -- Replace / after a space with (/
    + REPLACE(
        -- Replace / before by a space with /)
        REPLACE( in_str, ' /', ' (/' ),
        '/ ', '/) '
      )
    -- If the string ends with '/', append ')'
    + CASE WHEN in_str LIKE '%/' THEN ')' ELSE '' END
  ) AS out_str
FROM table1;

如果table1具有以下in_str值,则会为您提供相应的out_str值:

in_str                    out_str
------------------------  ------------------------------
/one/ two /three/ /four/  (/one/) two (/three/) (/four/)
one /two/ /three/         one (/two/) (/three/)
/one/ /two/ three         (/one/) (/two/) three
//one / // two/ /         (//one (/) (//) two/) (/)

我已经包含了最后一个来展示一些边缘情况。另请注意,这仅处理/个字符后紧跟空格或字符串的开头或结尾。不处理其他空格字符,如换行符和制表符。例如,如果您有一个这样的字符串(其中表示换行符,表示标签符号):

/one/⇒/two/⏎
/three/⏎

...你得到的输出是:

(/one/⇒/two/⏎
/three/⏎

你可以使用额外的REPLACE函数处理这些场景,但这是一个你必须自己跳下来的兔子洞。