2009-04-16 119 views
2

我有一个包含字符串具有以下格式数据的列:SQL更新 - 内的所有内容()

blablablabla(XYZ) 

,我想放弃外面的()的一切 - 并且圆括号自己 - 和使用()内的值更新该字段。这意味着,在这种特殊情况下,“blablabla”将被丢弃,并且该条目只包含XYZ。

我知道我必须使用SQL UPDATE,但我不确定如何正确构建where条件。

非常感谢, 哈尔

编辑:我忘了说,这是在SQL Server 2008中 谢谢大家对你的答案,他们所有的工作(我测试)。太糟糕了,我不能将所有标记为正确。我真的很惊讶,答案很快。

回答

4

这假定有恰好1双正确的嵌套括号(和是T-SQL语法):

DECLARE @bla VARCHAR(50) 
SET @bla = 'blablablabla(XYZ)asdsdsad' 

SELECT SUBSTRING(
     @bla, 
     CHARINDEX('(', @bla) + 1, 
     CHARINDEX(')', @bla) - CHARINDEX('(', @bla) - 1 
     ) 

收率:

'XYZ' 

编辑:这将检查各种格式不正确的字符串,并可以在WHERE子句中使用(例如, WHERE ... <> 'no match'):

SELECT 
    CASE 
    WHEN 
     /* check for '(' and ')' */ 
     CHARINDEX('(', @bla) > 0 AND CHARINDEX(')', @bla) > CHARINDEX('(', @bla) 
     /* check for 'bla(bla(XYZ)bla' */ 
     AND CHARINDEX('(', @bla, CHARINDEX('(', @bla) + 1) = 0 
     /* check for 'bla(XYZ)bla)bla' */ 
     AND CHARINDEX(')', @bla, CHARINDEX(')', @bla) + 1) = 0 
    THEN SUBSTRING(@bla, 
      CHARINDEX('(', @bla) + 1, 
      CHARINDEX(')', @bla) - CHARINDEX('(', @bla) - 1 
     ) 
    ELSE 'no match' 
    END 
+0

+1表示嵌套括号部分的条件。 – Learning 2009-04-16 16:02:05

+0

其实,如果数据没有括号,会不会出错? – Learning 2009-04-16 16:10:54

+0

这就是为什么我包含“假定一对”部分。:-) – Tomalak 2009-04-16 16:14:53

5

MySQL

UPDATE mytable 
SET  column = SUBSTRING(column, INSTR(column, '(') + 1, INSTR(column, ')') - INSTR(column, '(') - 1) 
WHERE column RLIKE ('\\(.*\\)') 
+0

可能要添加WHERE列LIKE '%(%)%',这样你就不会尝试更新不匹配的格局 – 2009-04-16 17:14:59

+0

我行忘了说它是在SQL Server 2008中。 谢谢你的解决方案,我给+1 – 2009-04-16 17:17:19

+0

@Dave Costa:对。 – Quassnoi 2009-04-16 17:26:02

3

MSSQL Solution。你要找的功能是CHARINDEX 称为包含一列测试简单的表称为[名]

代码中插入条目

INSERT INTO TEST (name) VALUES ('SomeString(test1)') 
INSERT INTO TEST (name) VALUES ('test2') 
INSERT INTO TEST (name) VALUES ('SomeOtherString(test3)') 
INSERT INTO TEST (name) VALUES ('test4') 

SQL代码,找到相关条目

SELECT *, 
    charindex('(', name), 
    charindex(')', name), 
    substring(
     name, 
     charindex('(', name) + 1, 
     charindex(')', name) - charindex('(', name) - 1 
    ) 
FROM 
    TEST 
WHERE 
    name like '%(%)%' 

SQL代码更新条目

UPDATE 
    TEST 
SET 
    name = substring(
     name, 
     charindex('(', name) + 1, 
     charindex(')', name) - charindex('(', name) - 1 
    ) 
WHERE 
    name like '%(%)%' 
+0

嘿,我还是设法在您发布之前复制您的解决方案。 :-P – Tomalak 2009-04-16 15:58:40

+0

heh!这是我得到的实际写在Mngt Studio,而不是我的头顶:) – 2009-04-16 16:00:38

+0

嗯,实际上我在SSMS中编写了我的文章,没有使用子字符串函数正确计算字符串索引计算太令人尴尬。 ;-) – Tomalak 2009-04-16 16:07:58

2

for sql s erver

declare @x varchar(100) 

set @X= 'fgjfkfgkjz(12345)' 
set @X= '()' 
set @X= '(1234)' 
set @X= 'fgjfkfgkjz()dfddf' 
set @X= 'fgjfkfgkjz(123)dfddf' 

PRINT '>>'+SUBSTRING(@x,CHARINDEX('(',@x)+1,CHARINDEX(')',@x)-(CHARINDEX('(',@x))-1)+'<<' 

update命令:

UPDATE YourTable 
    SET YourColumn=SUBSTRING(YourColumn,CHARINDEX('(',YourColumn)+1,CHARINDEX(')',YourColumn)-(CHARINDEX('(',YourColumn))-1) 
    WHERE xxx=yyy