2009-04-16 114 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