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

Thi*_*Lam 0 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
Run Code Online (Sandbox Code Playgroud)

每个项目都是特定的出版物类型,包括一般供应商和出版物类型的供应商. 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
Run Code Online (Sandbox Code Playgroud)

如您所见,如果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
Run Code Online (Sandbox Code Playgroud)

我可以通过检索所有行并在代码级别执行过滤来实现上述目的.是否有一种SQL方法可以获得上述结果?数据库设计和数据是我无法控制的,所以我无法重新设计数据库,必须使用上面的表结构.

dpm*_*gly 5

这很难看,但你可以把这个逻辑扔进一个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
Run Code Online (Sandbox Code Playgroud)