如何在一个查询中选择以下数据

时间:2018-05-30 06:53:25

标签: sql postgresql

我正在使用 postgres

表1:人

Columns:: id,person_name,person_add,block_id
FK==>person(block_id) reference block(id)

表2:阻止

Columns:: id,block_name,district_id
FK==> block(district_id) reference district(id)

表3:分区

Columns:: id,district_name,state_id
FK==> district(state_id) reference state(id)

表4:状态

Columns:: id,state_name,country_id
FK==> state(country_id) reference country(id)

表5:国家/地区

Columns:: id,country_name

我写的查询如下::

当我想要块明智的细节时

SELECT p.id,p.person_name,b.block_name,d.district_name,s.state_name,c.country_name
FROM person p 
INNER JOIN block b ON b.id = p.block_id
INNER JOIN district d ON d.id = b.district_id
INNER JOIN state s ON s.id = d.state_id
INNER JOIN country c ON c.id = s.country_id
WHERE b.id = ? OR d.id = ? OR s.id = ? OR c.id = ?

如何在单个查询中写下以下情况???

1.i只有国家ID和s.id,d.id,b.id将为null(以上查询给出了良好的结果)

2.i有国家ID和州ID以及d.id,b.id(这里根据c.id更喜欢)

3.i有国家ID,州ID和地区ID b.id(在这里它会更喜欢根据c.id)

4.i有国家ID,州ID,区域ID和块ID为空(在这里它会更喜欢根据c.id)

1 个答案:

答案 0 :(得分:1)

如果我理解正确,标准是可选的。您可能正在搜索某个国家/地区,州,区和街区,或者仅针对某个国家/地区进行搜索。

因此请检查每个变量是否为null。像这样:

SELECT p.id,p.person_name,b.block_name,d.district_name,s.state_name,c.country_name
FROM person p 
INNER JOIN block b    ON b.id = p.block_id
INNER JOIN district d ON d.id = b.district_id
INNER JOIN state s    ON s.id = d.state_id 
INNER JOIN country c  ON c.id = s.country_id
WHERE (b.id = :block_id    OR :block_id is null)
  AND (d.id = :district_id OR :district_id is null)
  AND (s.id = :state_id    OR :state_id is null)
  AND (c.id = :country_id  OR :country_id is null);

(您也可以将条件移至ON条款;无论您喜欢哪种条款。)