2011-06-09 61 views
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 

每个项目的是一个特定出版物类型与一般的供应商和出版的一类供应商。 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方法来获得上述结果?数据库设计和数据超出了我的控制范围,所以我不能重新设计数据库,而必须使用上述表结构。

+0

为什么要为Booksupplier,MagazineSupplier等设置单独的栏目?如果每个发布类型只能拥有该特定发布类型的供应商,那么这看起来很复杂并且没有什么价值。在您的示例数据中,没有行有两列填充了不同的供应商ID。那么为什么不只是有一个“供应商”栏? – 2011-06-09 20:16:44

+0

@Charles Bretana他已经表示设计超出了他的控制范围。希望在他接受dpmattingly的回答后,他可以将设计师从一座桥梁中解放出来。 :-) – MarkD 2011-06-09 20:20:48

+0

这是我最初的观察,我同意这是错误的数据库设计,但我必须使用这种表和数据。 – 2011-06-09 20:21:46

回答

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 
0

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)