存储过程WHERE动态检查param NAME是否为空或具有值

时间:2018-05-24 00:55:56

标签: mysql stored-procedures where-clause

创建动态sp的最有效方法是什么,我检查param NAME是null还是有值。 我的目标这里是选择特定的名称,他们的数据其他只显示数据的所有名称,如果参数 NAME 为null或没有提交值。 这是我的2解决方案:

选项1

IF (SELECT call_transactions.`called_name` IS NULL FROM call_transactions) THEN
    SELECT a.`called_name` , DATE_FORMAT(a.`start_datetime`,"%m/%d/%Y %T") AS start_datetime , DATE_FORMAT(a.`end_datetime`,"%m/%d/%Y %T") AS end_datetime, SEC_TO_TIME(a.`duration`) AS duration
    FROM call_transactions a
    WHERE a.`user_id` = pUSERID AND a.duration <> 0 AND DATE_FORMAT(a.start_datetime , "%m/%d/%Y") BETWEEN pSTART AND pEND
    ORDER BY a.start_datetime DESC;
ELSE
    SELECT a.`called_name` , DATE_FORMAT(a.`start_datetime`,"%m/%d/%Y %T") AS start_datetime , DATE_FORMAT(a.`end_datetime`,"%m/%d/%Y %T") AS end_datetime, SEC_TO_TIME(a.`duration`) AS duration
    FROM call_transactions a
    WHERE a.`user_id` = pUSERID AND a.called_name = pNAME AND a.duration <> 0 AND DATE_FORMAT(a.start_datetime , "%m/%d/%Y") BETWEEN pSTART AND pEND
    ORDER BY a.start_datetime DESC;
END IF;

选项2

SELECT a.`called_name` , DATE_FORMAT(a.`start_datetime`,"%m/%d/%Y %T") AS start_datetime , DATE_FORMAT(a.`end_datetime`,"%m/%d/%Y %T") AS end_datetime, SEC_TO_TIME(a.`duration`) AS duration
FROM call_transactions a
WHERE a.`user_id` = pUSERID AND (a.called_name = pNAME OR pNAME = '') AND a.duration <> 0 AND DATE_FORMAT(a.start_datetime , "%m/%d/%Y") BETWEEN pSTART AND pEND
ORDER BY a.start_datetime DESC;

提前感谢启蒙家伙。这里只是一个好奇的孩子

1 个答案:

答案 0 :(得分:0)

使用您的第二个选项,但要测试正确的值。

WHERE a.`user_id` = pUSERID 
  AND (pNAME IS NULL OR a.called_name = pNAME) 
  AND a.duration <> 0 AND DATE_FORMAT(a.start_datetime , "%m/%d/%Y") BETWEEN pSTART AND pEND

在第二个条件中,请注意我颠倒了这些条款。

这不是绝对必要的,因为优化器应该删除任何不必要的条件,但这会使您的短路意图明确。

另请注意,NULL不等于空字符串,并且没有任何内容等于NULL,因此如果您正在匹配NULL,则应使用IS NULL

我不知道你在这里与DATE_FORMAT()做了什么,但不要这样做。

在任何地方使用正确的日期时间,或使用STR_TO_DATE()转换参数,而不是DATE_FORMAT()。你无法比较mm / dd / yyyy&#34;之间的差异。两个值。这没有意义。 12/09/2010是&#34;之间&#34; 2017年8月12日和12月10日,因为您的代码是比较字符串,而不是比较日期。

作为一项规则,您不应该使用列作为参数在WHERE中运行,因为这会破坏列上的任何索引并强制执行完整扫描。