我正在使用 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)
答案 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
条款;无论您喜欢哪种条款。)