Mysql 动态检查参数名是否为null或是否有值的存储过程
创建动态sp的最有效方法是什么?在动态sp中,我会检查参数名的null或has值。 我的目标是选择特定的名称及其数据,如果param name为null或未提交任何值,则仅显示所有名称和数据。 以下是我的2个解决方案: 选择1 选择2Mysql 动态检查参数名是否为null或是否有值的存储过程,mysql,stored-procedures,where-clause,Mysql,Stored Procedures,Where Clause,创建动态sp的最有效方法是什么?在动态sp中,我会检查参数名的null或has值。 我的目标是选择特定的名称及其数据,如果param name为null或未提交任何值,则仅显示所有名称和数据。 以下是我的2个解决方案: 选择1 选择2 提前感谢你们的启蒙运动。这里只是一个好奇的孩子使用第二个选项,但测试正确的值 WHERE a.`user_id` = pUSERID AND (pNAME IS NULL OR a.called_name = pNAME) AND a.duration
提前感谢你们的启蒙运动。这里只是一个好奇的孩子使用第二个选项,但测试正确的值
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_格式做什么,但不要这样做
在任何地方使用正确的日期时间,或者使用STR_TO_DATE转换参数,而不是针对列使用DATE_格式。无法比较两个值之间的mm/dd/yyyy。那没有道理。2010年9月12日介于2017年8月12日和2017年10月12日之间,因为您的代码是按词法比较字符串,而不是比较日期
通常,您不应该使用列作为参数在WHERE中运行,因为这会破坏列上的任何索引并强制进行完全扫描。您可能希望读取NULL vs。他们是不可互换的。谢谢你的解决方案,先生,但是如果pNAME为NULL,我仍然没有得到所有的数据。我使用DATE_格式只是为了方便地获得数据库中的输入,并比较两个日期以获得这些日期内的数据。
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;
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