Заменить несколько строк в SQL-запросе
Я пишу SQL-запрос в SQL Server, в котором мне нужно заменить несколько строковых значений на одно строковое значение. Например
Product Quantity
------- --------
Apple 2
Orange 3
Banana 1
Vegetable 7
Dairy 6
станет
Product Quantity
------- --------
Fruit 2
Fruit 3
Fruit 1
Vegetable 7
Dairy 6
Единственным способом, которым я знаю, как это сделать, является использование вложенного REPLACE в предложении SELECT.
SELECT
REPLACE('Banana', REPLACE('Orange', REPLACE('Banana', Product, 'Fruit'),
'Fruit'), 'Fruit') AS Product
FROM
Table
Есть ли более простой способ?
EDIT: в категории "Продукт" могут быть другие значения. См. Отредактированный пример выше.
Ответы
Ответ 1
У BradC есть лучший ответ, но если вы по какой-то причине не смогли создать дополнительную таблицу, я хотел бы опубликовать адаптацию ответа Кибби:
SELECT
CASE WHEN Product IN ('Banana', 'Apple', 'Orange') Then 'Fruit'
ELSE Product END
FROM [Table]
Ответ 2
Создайте новую таблицу "категории", в которой есть список ваших продуктов, а также "категория", к которой они принадлежат.
Затем просто сделайте внутреннее соединение.
Ответ 3
Select
Case Product WHEN 'Banana' Then 'Fruit'
WHEN 'Apple' Then 'Fruit'
WHEN 'Orange' Then 'Fruit'
ELSE Product
END
FROM Table
Ответ 4
Если нет других продуктов, кроме указанных, вы можете:
SELECT 'Fruit' AS Product,
Quantity
FROM Table
Если есть другие продукты, добавьте предложение WHERE
WHERE Product IN ('Banana', 'Orange', 'Apple')
Ответ 5
Вы можете создать временную таблицу с колонкой "Продукт" с одним столбцом и вставить все имена продуктов, которые вы хотите заменить.
Затем выполните внутреннее соединение с целевой таблицей для вашего обновления.
UPDATE
Table
SET Product = 'Fruit'
FROM
Table t1 INNER JOIN #Table t2 on t1.Product = t2.Product
Ответ 6
Предложение создать таблицу категории будет вашим лучшим выбором в долгосрочной перспективе.
Для примера ознакомьтесь с этой ссылкой: Данные принадлежат вашим таблицам - не в вашем коде
Ответ 7
Одиночные кавычки для разграничения текста в SQL:
CASE WHEN ShiptoPlant IN (';','/',' ') Then '' ELSE ShipToPlant END