在SQL中,如何匹配特定行上的特定列?

在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

这可能很难在标题中描述,以下是一个示例数据:

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
每个项目都是特定的出版物类型,有一个一般供应商和一个出版物类型的供应商<代码>其他项目只有一个
常规\u 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\u type
属于
book,catalog,magazine
,我将忽略
general\u 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方法可以获得上述结果?数据库设计和数据超出了我的控制范围,因此我无法重新设计数据库,必须使用上面的表结构。

这很难看,但您可以将该逻辑放入
案例
结构中

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

这很难看,但您可以将该逻辑放入
案例
结构中

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

救援

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)

救援

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)

为什么书商、杂志商等有单独的专栏??如果每个Pub类型只能有特定pubType的供应商,那么这似乎不必要地复杂,增加的价值也很小。在示例数据中,没有一行有两列填充了不同的供应商ID。那么为什么不设立一个“供应商”专栏呢?@Charles Bretana他已经说过设计超出了他的控制范围。希望在他接受了马丁利的回答后,他能把设计师从桥上摔下来。:-)这是我最初的观察,我同意这是糟糕的数据库设计,但我必须处理这种表和数据。为什么书商、杂志商等有单独的专栏??如果每个Pub类型只能有特定pubType的供应商,那么这似乎不必要地复杂,增加的价值也很小。在示例数据中,没有一行有两列填充了不同的供应商ID。那么为什么不设立一个“供应商”专栏呢?@Charles Bretana他已经说过设计超出了他的控制范围。希望在他接受了马丁利的回答后,他能把设计师从桥上摔下来。:-)这是我最初的观察,我同意这是糟糕的数据库设计,但我必须处理这种表和数据。