Добавить подстановочные знаки в SELECT с MySQL - PullRequest
0 голосов
/ 06 апреля 2020

Использование MySQL:

У меня есть таблица 'city': id, 'name', 'serve' содержит:

'1', 'Athens', 'Athens, Etowah, Madisonville'
'2', 'Etowah', 'Etowah, Athens, Madisonville, Niota'
'3', 'Madisonville', 'Madisonville, Niota, Athens, Etowah'
'4', 'Soddy Daisy', 'Soddy Daisy, Decatur, Graysville'
'5', 'Signal Mountain', 'Signal Mountain, Walden, Jasper, Kimball'

У меня есть таблица 'zipcodes': id, 'zipcode', 'cityname' содержит:

'1','00000','Athens'
'2', '00001', 'Dayton'
'3', '00002', 'Soddy Daisy'

Таким образом, в городе «сервировка» - это разделенная запятыми строка областей, окружающих «название» крупного города, начиная с крупного города.

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

SELECT serving FROM `city` WHERE serving LIKE '%Athens%'

То, что я пытаюсь получить, - это название главного города из списка городов, где название города НЕ в обслуживании. Главный бонус, если он вернул список, в котором «название города» имеет приоритет по позиции в строке. Изначально цель состояла в том, чтобы убедиться, что каждое «имя города» в почтовых индексах указано в поле «Обслуживающий город».

Требуемый выходной пример 1017 * Бонус; Затем, когда я обнаружил «00000» Афины (в порции): Афины, Этова, Мэдисонвилль

Я попытался:

SELECT z.cityname FROM zipcodes z
WHERE z.cityname NOT IN (
    SELECT c.serving FROM city c
        WHERE c.serving LIKE CONCAT('''%',z.cityname,'%'''))

Но в городе, «обслуживающему», не найдено ни одного совпадения. list.

Я попытался отформатировать строку по-другому, но я получаю ошибки.

SELECT z.cityname FROM zipcodes z
WHERE z.cityname NOT IN (
    SELECT c.serving FROM city c
        WHERE c.serving LIKE '%' + z.cityname + '%')

Так что я полагаю, что это в моей строке для совпадения с подстановочным знаком, где это не удается. Так что любые советы будут с благодарностью.

Мой опыт работы с базами данных в основном MS SQL, и поиск здесь, и Google не отображает то, что я ищу, почему мой SELECT не работает.

Спасибо!

Редактировать: добавлено больше образцов для таблиц данных

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Вы можете объединить таблицы и использовать для результата выражение CASE:

select z.*,
  case 
    when c.id is null then concat('(NOT IN serving): ', z.cityname)
    else concat('(IN serving): ', c.serving)
  end result 
from zipcodes z left join city c
on find_in_set(z.cityname, c.serving)
order by z.id

Я использовал функцию find_in_set() вместо оператора like, который нужно объединить подстановочные знаки.
См. Демоверсию . Результаты:

| id  | zipcode | cityname    | result                                         |
| --- | ------- | ----------- | ---------------------------------------------- |
| 1   | 00000   | Athens      | (IN serving): Athens, Etowah, Madisonville     |
| 2   | 00001   | Dayton      | (NOT IN serving): Dayton                       |
| 3   | 00002   | Soddy Daisy | (IN serving): Soddy Daisy, Decatur, Graysville |
1 голос
/ 06 апреля 2020

, если вы хотите найти почтовые индексы, которые «не обслуживаются» ни в одном из городов, которые вы можете использовать:

SELECT z.zipcode, z.cityname 
FROM zipcodes z
WHERE NOT EXISTS (
  SELECT * 
  FROM city c
  WHERE c.serving LIKE CONCAT('%',z.cityname,'%')
)

См. db-fiddle .

...