#sql
#sql
Вопрос:
Это может быть сложно описать в названии, вот пример данных:
id pub_type general_suppl book_suppl catalogue_suppl magazine_suppl
1 book 10 10 0 0
2 book 11 11 0 0
3 catalogue 10 0 10 0
4 magazine 9 0 0 9
5 other 10 0 0 0
6 magazine 8 0 0 10
Каждый элемент относится к определенному типу публикации с общим поставщиком и поставщиком для типа публикации. у other
элементов есть только general_suppl
. Если я хочу получить все элементы по значению поставщика 10
, должны быть выполнены следующие условия:
if pub_type == 'book'
match on book_suppl == 10
elif pub_type == 'catalogue'
match on catalogue_suppl == 10
elif pub_type == 'magazine'
match on magazine_suppl == 10
else
match on general_suppl == 10
Как вы можете видеть выше, если pub_type
попадает в book,catalogue,magazine
, я игнорирую столбец general_suppl
.
Ожидаемый результат для значения поставщика 10
будет:
id pub_type general_suppl book_suppl catalogue_suppl magazine_suppl
1 book 10 10 0 0
3 catalogue 10 0 10 0
5 other 10 0 0 0
6 magazine 8 0 0 10
Я могу достичь вышеуказанного, извлекая все строки и выполняя фильтрацию на уровне кода. Есть ли единственный способ SQL для получения вышеуказанных результатов? Дизайн базы данных и данные находятся вне моего контроля, поэтому я не могу перепроектировать БД и должен буду работать с приведенной выше структурой таблицы.
Комментарии:
1. Почему у вас есть отдельный столбец для Booksupplier, MagazineSupplier и т.д.?? Если у каждого типа Pub могут быть поставщики только для этого конкретного типа Pub, это кажется излишне сложным и добавляет мало значения. В вашем примере данных ни в одной строке нет двух столбцов, заполненных разными идентификаторами поставщика. Так почему бы просто не иметь столбец «Поставщик»?
2. @Charles Bretana он уже сказал, что дизайн находится вне его контроля. Надеюсь, после того, как он примет ответ dpmattingly, он сможет сбросить дизайнера с моста. 🙂
3. Это было мое первоначальное наблюдение, я согласен, что это плохой дизайн базы данных, но мне приходится работать с такого рода таблицами и данными.
Ответ №1:
Это некрасиво, но вы можете добавить эту логику в CASE
структуру.
SELECT *
FROM table
WHERE 10 = CASE WHEN pub_type = 'book' THEN book_suppl
WHEN pub_type = 'catalogue' THEN catalogue_suppl
WHEN pub_type = 'magazine' THEN magazine_suppl
ELSE general_suppl END
Ответ №2:
and
на помощь!
select *
from table
where (pub_type='book' and book_suppl=10)
or (pub_type='catalogue' and catalogue_suppl=10)
or (pub_type='magazine' and magazine_suppl=10)
or (pub_type not in ('book','catalogue','magazine') and general_suppl=10)