В SQL, как мне сопоставить определенные столбцы в определенных строках?

#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)