在mySQL WHERE子句中遇到IFNULL问题

时间:2015-04-15 09:38:22

标签: mysql ifnull

在有人说之前,我已经为我的问题找到了合适的答案,但找不到足够的具体内容,所以我想我会问它。

基本上我试图为一个向网站提出贷款申请的人的报告选择一堆数据,但有两种不同的类型:不安全和保证。我需要在WHERE子句中放置一个IFNULL语句,这样如果某个其他字段不为null,我只能使用该子句。

以下是我的发言:

SELECT 
    la.`lms_loan_application_id`,
    la.`created`,
    la.`updated`,
    la.`loan_amount`,
    la.`loan_term`,
    la.`loan_document_fee`,
    la.`broker_reference`,
    la.`broker_sub_reference`,
    laa.`first_name`,
    laa.`surname`,
    laa.`dob`,
    laa.`email`,
    laa.`mobile_number`,
    laaAd.`address_postcode`,
    lag.`first_name`,
    lag.`surname`,
    lag.`dob`,
    lag.`email`,
    lag.`mobile_number`,
    lagAd.`address_postcode`,
    lagAd.`housing_status`
FROM
    loan_application AS la
        JOIN
    loan_application_applicant AS laa ON la.`id` = laa.`loan_application`
        LEFT JOIN
    loan_application_guarantor AS lag ON la.`id` = lag.`loan_application`
        JOIN
    loan_application_address AS laaAd ON laaAd.`loan_application_applicant` = laa.`id`
        LEFT JOIN
    loan_application_address AS lagAd ON lagAd.`loan_application_guarantor` = lag.`id`
WHERE
    la.`status` = 'signature_given'
        AND ! IFNULL(lag.`first_name`,
            lag.`status` = 'signature_given')
        AND laa.`status` = 'signature_given'
        AND ! IFNULL(lag.`first_name`,
            lagAd.`current_address` = 1)
        AND laaAd.`current_address` = 1
ORDER BY la.`updated` DESC
LIMIT 10000

正如你所看到的,我试图使用IFNULLs(虽然以一种否定的方式,我假设它有效?)但我得到的只是重复的行结果,而不是我真正想要的结果集。

基本上,我需要使用where子句“lag.status ='signature_given”和“lagAd.current_address = 1”,如果lag.first_name字段为非null(即有保证名称),否则状态为赢不存在,因此无抵押贷款的结果不会显示。希望我能解释得这么好!

总之,我需要显示所有贷款信息,无担保和保证,并使用否定的IFNULL来确定何时考虑WHERE子句。

任何帮助表示赞赏!

提前谢谢你 迈克尔

1 个答案:

答案 0 :(得分:1)

来自this MySQLTutorial article

  

请注意,您应该避免在WHERE子句中使用IFNULL函数,因为它会降低查询的性能。如果要检查值是否为NULL,可以在WHERE子句中使用IS NULL或IS NOT NULL。

这是一个WHERE子句,它使用IS NULLIS NOT NULL代替IFNULL正确实现您的逻辑:

WHERE la.`status` = 'signature_given' AND
(lag.`first_name` IS NULL OR
(lag.`first_name` IS NOT NULL AND lag.`status` = 'signature_given')) AND
laa.`status` = 'signature_given' AND
(lag.`first_name` IS NULL OR
(lag.`first_name` IS NOT NULL AND lagAd.`current_address` = 1)) AND 
laaAd.`current_address` = 1