У меня есть списки, как это хранится в поле в SQL:Поиск значения в список разделенных запятыми
Id MyListField
1 soy, meat, milk, wheat, nuts
2 soy, meat, nuts, milk, wheat
3 nuts
4 walnuts, nutshell, nuts
5 nuts, beans
6 walnuts, hazel nuts
7 nutshell, nutsize
Это не нормализуется, и я не могу изменить его. Теперь я должен найти nuts
и заменить их на insane
(но сохраните, например, hazel nuts
и nutshell
).
Поле поиска сравнительно легко, есть четыре случая, и я имею замещающий характер %
в моем распоряжении:
SELECT * FROM MyTable WHERE
MyListField LIKE 'nuts' OR
MyListField LIKE 'nuts, %' OR
MyListField LIKE '%, nuts' OR
MyListField LIKE '%, nuts, %'
Но заменить трудно, потому что у меня нет заполнителя или startofstring/endofstring символов :
UPDATE MyTable SET MyListField =
REPLACE(
REPLACE(
REPLACE(
REPLACE(
MyListField,
', nuts, ' ,
', insane, '
),
????,
????
),
????,
????
),
????,
????
)
WHERE
MyListField LIKE 'nuts' OR
MyListField LIKE 'nuts, %' OR
MyListField LIKE '%, nuts' OR
MyListField LIKE '%, nuts, %'
Я могу легко заменить его в середине строки, но не в начале или в конце. Или я могу?
Я использую SQL Server 2008, если это имеет значение.
Разделите данные на строки, используя функцию разделения строк, затем замените строки, в которых находится элемент, и проанализируйте все вместе, используя xml path trick –
Это очень похожий вопрос: http://stackoverflow.com/questions/29574811/replace-semicolons-separated-values-with-another-table-values –