通常您通过在每个条件中添加OR l_variable IS NULL 来做到这一点:
select a.province,a.DISTRICT,a.VILLAGE,a.TRIBE,a.CLAN,b.cdr_data
from itaukei_data_store b INNER JOIN itaukei_data_store_key a
ON a.reference_no = b.reference_no
and a.record_no = b.record_no
and a.province = l_province
WHERE l_district IS NULL OR a.district = l_district
and l_village IS NULL OR a.village = l_village
and l_tribe IS NULL OR a.tribe= l_tribe
and l_clan IS NULL OR a.clan = l_clan
order by a.DISTRICT,a.VILLAGE,a.TRIBE,a.CLAN;
但是,这有时可能会影响性能。对每种组合使用 IF 会更好。或者,您可以尝试使用支持短路的 CASE 语句,如下所示:
select a.province,a.DISTRICT,a.VILLAGE,a.TRIBE,a.CLAN,b.cdr_data
from itaukei_data_store b INNER JOIN itaukei_data_store_key a
ON a.reference_no = b.reference_no
and a.record_no = b.record_no
and a.province = l_province
WHERE a.district = CASE WHEN l_district IS NULL THEN a.district ELSE l_district END
and a.village = CASE WHEN l_village IS NULL THEN a.village ELSE l_village END
and a.tribe = CASE WHEN l_tribe IS NULL THEN a.tribe ELSE l_tribe END
and a.clan = CASE WHEN l_clan IS NULL THEN a.clan ELSE l_clan END
order by a.DISTRICT,a.VILLAGE,a.TRIBE,a.CLAN;
你有第三种选择。您可以使用COALESCE 代替CASE,如下所示:
select a.province,a.DISTRICT,a.VILLAGE,a.TRIBE,a.CLAN,b.cdr_data
from itaukei_data_store b INNER JOIN itaukei_data_store_key a
ON a.reference_no = b.reference_no
and a.record_no = b.record_no
and a.province = l_province
WHERE a.district = COALESCE(l_district, a.district)
and a.village = COALESCE(l_village, a.village)
and a.tribe = COALESCE(l_tribe, a.tribe)
and a.clan = COALESCE(l_clan, a.clan)
order by a.DISTRICT,a.VILLAGE,a.TRIBE,a.CLAN;
尝试每一种,看看哪一种表现更好。顺便说一句,我还将您的 FROM 子句从逗号分隔的表列表更改为标准的 INNER JOIN。请养成使用 JOIN 的习惯,因为它现在被认为是“最佳选择”