创建动态sp的最有效方法是什么?在动态sp中,im检查param name的null或has值。我的目标是选择特定的名称和它们的数据,如果param 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条答案
按热度按时间jogvjijk1#
使用第二个选项,但测试正确的值。
在第二个条件中,注意我颠倒了条件。
这并不是绝对必要的,因为优化器应该删去任何不必要的条件,但这会让您的短路意图变得清晰。
还要注意的是
NULL
不等于空字符串,也不等于NULL
,所以IS NULL
如果匹配的对象为null,则应使用。我不知道你在干什么
DATE_FORMAT()
给你,但别那么做。在任何地方使用正确的日期时间,或使用
STR_TO_DATE()
转换参数,而不是DATE_FORMAT()
靠着柱子。您不能将mm/dd/yyyy“在”两个值之间进行比较。那没道理。2010年9月12日是“介于”2017年8月12日和2017年10月12日之间,因为您的代码是比较字符串,而不是比较日期。通常,您不应该使用列作为参数来执行函数
WHERE
因为这会破坏列上的任何索引并强制进行完全扫描。