簡體   English   中英

如何創建WHERE子句,其中SQL查詢中有一些必填字段和一些其他可選字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM