Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 动态检查参数名是否为null或是否有值的存储过程_Mysql_Stored Procedures_Where Clause - Fatal编程技术网

Mysql 动态检查参数名是否为null或是否有值的存储过程

Mysql 动态检查参数名是否为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

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