2014-05-02 102 views
0

说我们在一列有这个值选择修改列

<color="blue" size="5"><color="red"> 

如何更换“红”与蓝色使用SQL语句?

(动态值,以便使用常规的更换不会做)

我真的怎么解决困惑。

+0

如果它不是'红色',而是'绿色',为什么REPLACE(col_name,'green','blue')'工作?你究竟想要完成什么? –

+0

试图改变RED现在的子字符串,而不管它的值是什么。 (假装你不知道第二个'颜色'是红色的) – user3594100

+0

你不说你使用的是什么版本的Oracle。这很重要,因为如果['REGEXP_REPLACE'](http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions130.htm)可用,它将大大简化事情。 – ob1quixote

回答

1

REGEXP_REPLACE使用正则表达式允许您指定模式您希望在给定字符串中替换。因为你的两个color标签结构不同,你可以利用这点来指定第二个实例相匹配的模式,但不是第一like so (SQL Fiddle)

SELECT your_column, 
     REGEXP_REPLACE(your_column, '(.*)<color=".+">', '\1<color="blue">') AS "your_column_fixed" 
    FROM your_table 
; 

这会采取的形式<color="blue" size="5"><color="???">的输入,并将其转换为一个第二个标签替换为<color="blue">。正则表达式中的. operator匹配任何非空字符。 +修饰符表示匹配.的一个或多个匹配项。使用圆括号围绕运算符表示匹配的值将在替换参数中可用,如\n,其中n是该模式中的对应位置。

+0

这太好了。我对一件事感到困惑......我使代码如此:'(。*)color =“。+”','\ 1color =“green”''(移除了<<),但只有第二个颜色实例更新 - 为什么从现在开始,第一个不匹配? – user3594100

+0

您的模式匹配'color =“'旁边的零个或多个字符,这会改变匹配的内容。正则表达式默认为”贪婪“匹配。要替换'color =”。+“'这两个实例,您需要一个模式与[“lazy”修饰符](http://www.regular-expressions.info/repeat.html)相似,如'REGEXP_REPLACE(“color_tags”,'color =“。+?”','color =“pink” ')' 请记住:[“有些人在遇到问题时想'我知道,我会用正则表达式'。现在他们有两个问题。“](http://programmers.stackexchange.com/questions/223634/what-is-meant-by-now-you-have-two-problems) – ob1quixote

+0

[Fiddle](http:// www.sqlfiddle.com/#!4/3d8b4/24)展示懒惰的比赛。 – ob1quixote

0

我会玩substringspatindex

DECLARE @COLOR varchar(20), 
@YOUR_VALUE varchar(100) 

SET @YOUR_VALUE = SUBSTRING(@YOUR_VALUE, 8, LEN(@YOUR_VALUE)) 
SET @COLOR = SUBSTRING(@YOUR_VALUE, 0, PATINDEX('%"%', @YOUR_VALUE)) 

上面移除了“颜色=‘这永远是长度为8,然后找到下一个的索引“’”,然后设置@COLOR到子串到该索引。

0

这里是一个强力表达:

select substr(col, 1, instr(col, '><color="'))||'<color="blue">' 

它发现的'><color='的第一次出现和替换从该点上与'<color="blue">'的字符串。