mysql—动态检查param name是否为null或是否有值的存储过程

w8f9ii69  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(270)

创建动态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;

提前谢谢你们的开悟。只是个好奇的孩子

jogvjijk

jogvjijk1#

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

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 ,所以 IS NULL 如果匹配的对象为null,则应使用。
我不知道你在干什么 DATE_FORMAT() 给你,但别那么做。
在任何地方使用正确的日期时间,或使用 STR_TO_DATE() 转换参数,而不是 DATE_FORMAT() 靠着柱子。您不能将mm/dd/yyyy“在”两个值之间进行比较。那没道理。2010年9月12日是“介于”2017年8月12日和2017年10月12日之间,因为您的代码是比较字符串,而不是比较日期。
通常,您不应该使用列作为参数来执行函数 WHERE 因为这会破坏列上的任何索引并强制进行完全扫描。

相关问题