[英]How can I create a WHERE clause where there are some mandatory fields and some other optional fields in a SQL query
我不太喜欢数据库,但我有以下疑问。 我正在使用MySql
我有此查询返回多个记录(它工作正常),并且我必须以某种方式添加WHERE子句,使某些字段为必填字段,而另一些字段为可选字段。
所以我有这个查询:
SELECT
EnutrifoodMessage.content
, MessageType.message_type_name
, Country.country_name
, IFNULL(Province.province_name, 'All Provinces') as province_name
, IFNULL(District.district_name, 'Any District') as district_name
, Crop.crop_name
, EnutriMessageDetails.creation_date
, EnutriMessageDetails.message_important_days
, temp_scale.scale_name as temperature
, humidity_scale.scale_name as humidity
, ProcessPhase.phase_name
, ProcessPhaseAction.process_phase_action_name
, Urgency.urgency_name as action
, IFNULL(MeteoWarningDescription.meteo_warning_description_name, '') as emergency
, IFNULL(EnutriMessageDetails.internal_link, '') as internal_link
, IFNULL(EnutriMessageDetails.reference_link, '') as reference_link
, IFNULL(EnutriMessageDetails.external_link, '') as external_link
, IFNULL(cleared_by_institution.institution_name, '') as message_cleared_by
, UserType.user_type_name as end_user
, provider.institution_name as provider
, ValueAddition.value_addition_name
FROM EnutriMessageDetails
LEFT JOIN EnutrifoodMessage
ON EnutrifoodMessage.id = EnutriMessageDetails.enutri_food_message_id
LEFT JOIN MessageType
ON MessageType.id = EnutriMessageDetails.message_type_id
LEFT JOIN Localization
ON Localization.id = EnutriMessageDetails.localization_id
LEFT JOIN Country
ON Country.id = Localization.country_id
LEFT JOIN Province
ON Province.id = Localization.province_id
LEFT JOIN District
ON District.id = Localization.district_id
LEFT JOIN Crop
ON Crop.id = EnutriMessageDetails.crop_id
LEFT JOIN Scale temp_scale
ON temp_scale.id = EnutriMessageDetails.temp_scale_id
LEFT JOIN Scale humidity_scale
ON humidity_scale.id = EnutriMessageDetails.humidity_scale_id
LEFT JOIN ProcessPhase
ON ProcessPhase.id = EnutriMessageDetails.process_phase_id
LEFT JOIN ProcessPhaseAction
ON ProcessPhaseAction.id = EnutriMessageDetails.process_phase_action_id
LEFT JOIN Urgency
ON Urgency.id = EnutriMessageDetails.urgency_id
LEFT JOIN MeteoWarningDescription
ON MeteoWarningDescription.id = EnutriMessageDetails.meteo_warning_description_id
LEFT JOIN Institution cleared_by_institution
ON cleared_by_institution.id = EnutriMessageDetails.cleared_by_id
LEFT JOIN UserType
ON UserType.id = EnutriMessageDetails.user_type_id
LEFT JOIN Institution provider
ON provider.id = EnutriMessageDetails.provided_by_id
LEFT JOIN ValueAddition
ON ValueAddition.id = EnutriMessageDetails.value_addition_id
WHERE Localization.id = 2
AND Crop.id = 2
ORDER BY EnutrifoodMessage.id
我需要以以下方式添加WHERE子句:
1)此字段是必填字段:
Localization.id = 2
UserType.id = 1
2)这些其他字段是可选的:
EnutriMessageDetails.creation_date >= a specified date
Urgency.id = 3
我希望必须插入第一种类型的字段,另一种类型必须是可选的并且不能填充。
如何正确处理这种情况?
尝试大小写表达式:
Where Localization.id = 2 and UserType.id = 1 and
1 = case when EnutriMessageDetails.creation_date >= **[a specified date]**
then case when and Urgency.id = 3
then 1
else 0
end
else 1
end
编辑:更正。
请尝试以下方法测试它是否可以正常工作,即检查其是否为null。 因此,您可以对此做出反应。
WHERE Urgency.id LIKE CASE WHEN Urgency.id IS NULL
THEN Urgency.id
ELSE CONCAT('%', Urgency.id, '%')
END
我没有mySql的测试环境,因此请检查它是否会在尝试提供帮助时起作用。
看来您想要:
WHERE (urgency.id = @urgencyid OR @urgencyid IS NULL)
要么
ON (urgency.id = @urgencyid OR @urgencyid IS NULL)
因此,当给出一个ID时,只会选择与该ID匹配的数据,而如果没有给出ID,则所有数据都会被选中。
如果表中不存在ID,则WHERE
子句将不会选择任何记录。 因此, urgency
表应该是内部联接的。 如果是外部联接,则WHERE
子句将其转换为内部联接,因为ID为null的记录将被取消。 避免这种伪外部联接。
对于内部联接,使用WHERE
还是ON
没有关系。 但是,对于外部联接, WHERE
子句会将其转换为内部联接(如前所述),而ON
子句仍将进行外部联接(具有给定的ID,或者找到ID或连接的空虚拟记录)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.