Обновление SQL - все внутри () - PullRequest
2 голосов
/ 16 апреля 2009

У меня есть столбец данных, содержащий строку в следующем формате:

blablablabla(XYZ)

и я хотел бы отменить все, кроме () - и самих скобок, - и установить обновить это поле со значением внутри (). Это подразумевает, что в данном конкретном случае «блаблабла» будет отброшена, и эта запись будет содержать только XYZ.

Я знаю, что должен использовать SQL UPDATE, но я не уверен, как правильно построить условие where.

Большое спасибо, Hal

РЕДАКТИРОВАТЬ: я забыл сказать, что это было в SQL Server 2008. Спасибо всем за ваши ответы, они все работали (я проверял). Жаль, что я не могу пометить все как правильное. Я действительно поражен, ответы были такими быстрыми.

Ответы [ 4 ]

5 голосов
/ 16 апреля 2009

В MySQL:

UPDATE  mytable
SET     column = SUBSTRING(column, INSTR(column, '(') + 1, INSTR(column, ')') - INSTR(column, '(') - 1)
WHERE   column RLIKE ('\\(.*\\)')
4 голосов
/ 16 апреля 2009

Предполагается, что существует ровно одна пара правильно вложенных скобок (и это синтаксис 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
3 голосов
/ 16 апреля 2009

Решение MSSQL. Функция, которую вы ищете - CharIndex Простая таблица с именем test, содержащая один столбец с именем [name]

Код для вставки записей

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 '%(%)%'
2 голосов
/ 16 апреля 2009

для сервера sql

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 YourTable
    SET YourColumn=SUBSTRING(YourColumn,CHARINDEX('(',YourColumn)+1,CHARINDEX(')',YourColumn)-(CHARINDEX('(',YourColumn))-1)
    WHERE xxx=yyy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...