MySQL - Использование оператора CASE и таблицы поиска? - PullRequest
0 голосов
/ 10 апреля 2020

Я спорю между использованием оператора CASE или таблицы поиска для замены текста с table2.columnB, когда table1.columnB = table2.columnA. Я бы предпочел использовать справочную таблицу, потому что им легче управлять.

Наша база данных извлекает всю информацию о заказах клиентов из нашего интернет-магазина. Он получает все названия штатов полностью, и мне нужно заменить все экземпляры штатов США их двухбуквенным сокращением. (например, Техас -> Техас)

Как мне использовать таблицу поиска с этим запросом для State?

Вот мой запрос: http://sqlfiddle.com/#! 9 / e44aa3 / 12 / 0

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

На ваш вопрос, как добавить таблицу соответствия в ваш код, вы должны добавить это объединение:

LEFT JOIN `state_abbreviations` AS `sa` ON `sa`.`shipping_zone` = `o`.`shipping_zone` 

и изменить эту строку:

`o`.`shipping_zone` AS `State`

с помощью:

COALESCE(`sa`.`zone_abbr`, `o`.`shipping_zone`) AS `State`

, поэтому вы получите сокращенное название. Смотрите демо . Результаты:

Order ID  Name          State   Qty Option  Size    Product     Ref
12345     Mason Sklut   NC      1   R       L       Tee         R / Tee L
12346     John Doe      OH      2   Bl      S       Hood        2x Bl / Hood S
0 голосов
/ 10 апреля 2020

Использование выражения CASE, безусловно, вариант. Тем не менее, он плохо масштабируется: в США более 50 штатов, поэтому вам нужно написать 50 when ветвей, например:

case state
    when 'North Carolina' then 'NC'
    when 'Ohio' then 'OH'
    when ...
end 

Создание таблицы сопоставления кажется лучшей идеей. Это также хороший способ обеспечить ссылочную целостность (ie гарантирует, что используемые имена действительно являются именами состояний).

Это будет выглядеть так:

create table states (
    code varchar(2) not null primary key,
    name varchar(100) not null
);

В исходной таблице вы хотите иметь столбец, в котором хранится код состояния, с ограничением внешнего ключа, которое ссылается на states(code) (вы также можете сохранить имя состояния, но это выглядит как менее эффективный вариант с точки зрения хранения ).

Сопоставление в запросах можно выполнить с помощью join:

select t.*, s.name state_name
from mytable t
inner join states s on s.code = t.state_code
...