我确信这是一个愚蠢的问题,但在阅读完所有内容后,我无法找出为Where子句创建具有后备逻辑的存储过程的正确方法。
我有以下查询:
SELECT FeeName, Amount, Category, VariableName
FROM client_rates WHERE state_abv = state_abvIN
AND Purchase= purchaseIN AND Category= CategoryIN And client_id=client_idIN AND
agent_id=agent_idIN AND ((lender_id=lender_idIN AND county=countyIN) OR (lender_id=lender_idIN
AND
county='NA') OR (lender_id=1 AND county=countyIN) OR (lender_id=1 AND county='NA'));
因为我使用了 OR 它将返回一个匹配所有 4 个条件的集合。我想要的是通过条件“回退”。
意思是我希望它返回一个集合,其中 (lender_id=lender_idIN AND County=countyIN) 返回一个值。但是,如果它返回 NULL 集,则尝试下一个条件集(lender_id=lender_idIN AND County='NA')等。
我不认为 CASE 可以解决这个问题,我曾经使用过嵌套的 IF EXIST 语句,它有效,但强制每个查询运行两次(必须有比这更好的解决方案)。
任何建议,感谢您的帮助。
最佳答案
你的问题不清楚。我假设 ...IN 符号是参数而不是列,“NA”是 client_rates 中 County 的可能值,并且在 WHERE 的最后一个 AND 条件中您想要返回行 where (...),否则where (...),否则 where (...) 等(CASE 表达式仅计算第一个真 WHEN。)
SELECT FeeName, Amount, Category, VariableName
FROM client_rates
WHERE state_abv=state_abvIN
AND Purchase=purchaseIN AND Category=CategoryIN
AND client_id=client_idIN AND agent_id=agent_idIN
AND CASE WHEN (lender_id=lender_idIN AND county=countyIN) THEN 1
WHEN (lender_id=lender_idIN AND county='NA') THEN 1
WHEN (lender_id=1 AND county=countyIN) THEN 1
ELSE (lender_id=1 AND county='NA')
END;
PS:
但这与以下查询不同:当 CASE 之前的所有内容都匹配时,如果未找到 lender_idIN,则为 lender_id 返回 1(无论是否存在 lender_id=1)如果未找到 CountyIN,则为 County 返回“NA”(无论是否存在 County='NA')。 (这可能涉及“NA”不是 client_rates 中的 County 的可能值。)当它们给出不同的结果时:如果未找到 lender_idIN 但没有 client_rates lender_id 值为 1 和/或如果未找到 CountyIN 但没有client_rates 县值为“NA”。然后,第一个查询将返回一个空表,但第二个查询将返回 1(代表 lender_id)和/或“NA”(代表县)。把你的“意思……”说清楚!包括查询“哪个有效”(如果您确定它有效)。
关于MYSQL存储过程查询回退逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26810139/