MYSQL存储过程查询回退逻辑

时间:2014-11-07 21:10:00

标签: mysql database stored-procedures database-design mysql-logic

我确信这是一个愚蠢的问题,但在阅读完所有内容后,我无法弄清楚使用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个条件的集合。我想要的是通过条件“回退”。

意思是我希望它返回一个集合where(lender_id = lender_idIN AND county = countyIN)返回一个值。但是,如果它返回NULL集,则尝试下一个条件集(lender_id = lender_idIN AND county ='NA')等。

我不认为CASE会解决这个问题而且我曾经使用过嵌套的IF EXIST语句,这些语句有效,但强制每个查询运行两次(必须有一个更好的解决方案)。

任何建议并感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

你的问题不明确。我假设... IN符号是参数而不是列,'NA'是client_rates中县的可能值,而在WHERE的最后AND条件中你要返回行(...),否则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,则为县返回'NA'(无论是否有县='NA')。 (这可能涉及'NA'在client_rates中不是县的可能值。)当它们给出不同的结果时:如果找不到lender_idIN但是没有client_rates lender_id值为1和/或如果找不到countyIN但是没有client_rates'NA'的县值。然后第一个查询将返回一个空表,但第二个查询返回一个表示lender_id和/或一个'NA'表示县。让你的“意义......”清晰!包括查询“哪个有效”(如果你确定它确实如此)。