Sql Query для поиска и замены определенных префиксных строк? - PullRequest
4 голосов
/ 28 января 2011

Хорошо, у меня есть что-то вроде этого (я все испортил ...) -

Id Name                     City
1  XXX - New                Plano
2  XXX - XXX - New1         Dallas
3  XXX - XXX - XXX - New2   Sacramento
4  XXX - New3               Houston
5  XXX - XXX - New4         Austin

Итак, я хочу заменить все вхождения более чем одним XXX префиксом только на 1. Длянапример, идентификатор 2 должен иметь имя = XXX - New2.Как бы добиться этого?Я думаю, что даже запрос в основном для проверки префикса и замены его именем будет работать, и тогда я смогу снова добавить префикс?Я имею в виду установить все записи просто чтобы сказать New, New2 .. и так далее ... и тогда я могу добавить к нему XXX-префикс?

Ответы [ 7 ]

5 голосов
/ 28 января 2011

Вы можете удалить все экземпляры 'XXX -' с помощью функции replace .

UPDATE tableName
SET Name = Replace(Name, 'XXX - ', '')

Альтернативно, чтобы сохранить один экземпляр, вы можете использовать:

UPDATE tableName
SET Name = 'XXX - ' + Replace(Name, 'XXX - ', '')
WHERE CHARINDEX('XXX - ', Name) > 0
2 голосов
/ 28 января 2011

Вы хотите вырезать вхождения от 2 до n строки "XXX -".Это предполагает, что данные в конце должны быть сохранены:

SELECT 'Starting' --also sets @@ROWCOUNT
WHILE @@ROWCOUNT <> 0
    UPDATE
       Bollixedtable
    SET
       name = STUFF (name, 7, 6, '')
    WHERE
       SUBSTRING (name, 7, 6) = 'XXX - '

В противном случае это удаляет XXX и сбрасывает ваши данные на основе шаблона XXX - New(id-1) без фильтра, если вы хотите начать снова

    UPDATE
       Bollixedtable
    SET
       name = 'XXX - New' + CAST(id-1 AS varchar)

Редактировать: обновлено для ясности

1 голос
/ 28 января 2011

Предполагая, что вы просто хотите удалить строку всех частей перед последним "-", а затем снова добавить префикс, вы можете использовать это:

UPDATE tblWhatever
SET Name = 'NewPrefix - ' + RIGHT(Name, CHARINDEX(' - ',REVERSE(Name))-1)

Это просто в основном, поискдля последнего вхождения "-", а затем использует функцию right(), чтобы получить последнюю часть строки.Затем он добавляет к этому префикс.

По сути, это то, что вы описали в последней части вашего вопроса.

1 голос
/ 28 января 2011

Многое зависит от данных и их однородности. Если все ваши данные попадают в форматы, которые у вас есть в вашем вопросе, то самым простым будет:

SELECT
    ID,
    'XXX - ' + SUBSTRING(NAME, CHARINDEX('NEW',NAME),LEN(Name)-CHARINDEX('NEW',NAME)) AS Name,
    CITY
FROM
    FOO

В противном случае это может быть намного сложнее. Расскажите подробнее о единообразии ваших данных и о том, в каком формате вы будете работать, например, могли бы вы иметь XXXX - XXXX - XXXX - XXXX - ad infintum?

1 голос
/ 28 января 2011
Update Table
Set Name = Replace(
                Replace(
                    Replace( Name, ' - XXX - ', ' - ')
                    , ' - XXX - ', ' - ')
                , ' - XXX - ', ' - ')

Это решение должно работать с большинством вариантов. Например, он будет обрабатывать весь путь до:

XXX - XXX - XXX - XXX - XXX - XXX - XXX - XXX - New2.

Если вам нужно обработать это дальше, вы можете просто добавить еще один вызов Replace.

0 голосов
/ 28 января 2011
declare @loop bit
set @loop = 1

while @loop
begin
  update table
  set name = right(name,len(name)-6)
  where left(name,12) = 'xxx - xxx - '

  set @loop = @@rowcount
end
0 голосов
/ 28 января 2011
update myTable 
set name = rtrim(ltrim(replace(name, 'XXX - XXX', 'XXX - '))) 

update myTable 
set name = rtrim(ltrim(substring(name, charindex(name, '-'), len(name)))) 
where name like '%-%' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...