检索公司时的优先级地址列表

时间:2013-09-26 09:09:33

标签: sql

我有一个SQL问题,我正在努力解决这个问题。请考虑这两个表格中的数据:

公司:

|    id    |    name    |
|     1    |Fake Company|

company_addresses:

|   id    |    company_id    |    name    |    address1    |    address2    |    town    |    postcode    |    main
|   1     |         1        | Head Office|   Building 2   |   RandStreet   |   London   |    L1 2FN      |     t
|   2     |         1        |    MAIN    |   Building 14  |   RandRoad     |   London   |    L1 6RR      |     f

我想要检索一家公司及其主要地址。 main表中的company_addresses列为true表示主地址。但是,数据有点搞砸了,有些地址只叫MAIN。有些公司根本没有任何地址!

那么,如何检索公司及其地址首先选择标记为MAIN的地址,然后如果不存在则获取名为MAIN的地址,如果不是存在什么都没有回报?我目前只有:

SELECT * FROM companies c
JOIN company_addresses ca ON ca.company_id = c.id
WHERE c.name = 'Fake Company'
AND ca.main IS TRUE

但显然只会带回标有主要地址的公司,而不是使用我想要的优先级列表。

2 个答案:

答案 0 :(得分:0)

SELECT * FROM companies c
JOIN company_addresses ca ON ca.company_id = c.id
WHERE c.name = 'Fake Company'
AND ((ca.main IS TRUE) OR (ca.main IS FALSE AND ca.name = 'MAIN'))

答案 1 :(得分:0)

我不知道Postgres - 但这可能是一个有用的概括:

SELECT * FROM companies c
JOIN company_addresses ca ON ca.company_id = c.id
WHERE c.name = 'Fake Company'
AND (ca.id IS NULL OR ca.id IN (SELECT TOP 1 id FROM company_addresses WHERE company_id = c.id ORDER BY main DESC, CASE WHERE name = MAIN 1 ELSE 0 END DESC))

这可能不是最快的解决方案,但使用相关子查询和TOP非常简单。