创建动态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;
提前感谢启蒙家伙。这里只是一个好奇的孩子
答案 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
中运行,因为这会破坏列上的任何索引并强制执行完整扫描。