如何避免 SQL 查询检查 IS NULL 的误报?

Posted

技术标签:

【中文标题】如何避免 SQL 查询检查 IS NULL 的误报?【英文标题】:How to avoid false positive on SQL query checking for IS NULL? 【发布时间】:2012-05-07 14:07:46 【问题描述】:

如何避免 SQL 查询检查 IS NULL 时的误报?

我似乎通过添加if(sqlsrv_has_rows 语句纠正了我的误报。

php

/*

IF select of 1900 datein has rows
update datein

IF select of 1900 dateout has rows
update dateout

IF select of 1900 datein AND dateout no rows
insert datein

*/
$datein_s="SELECT TOP 1 datein FROM clocked WHERE datein='1900-01-01 00:00:00' AND userid=? ORDER BY datein DESC";
$datein_sr=sqlsrv_query($dbconnect,$datein_s,$params) or die("Error datein:".print_r(sqlsrv_errors(),true));
$datein=sqlsrv_fetch($datein_sr);
if(sqlsrv_has_rows($datein_sr)===FALSE)

$datein="NOROWS";

else

$datein="HASROWS";


$dateout_s="SELECT TOP 1 dateout FROM clocked WHERE dateout='1900-01-01 00:00:00' AND userid=? ORDER BY dateout DESC";
$dateout_sr=sqlsrv_query($dbconnect,$dateout_s,$params) or die("Error dateout:".print_r(sqlsrv_errors(),true));
$dateout=sqlsrv_fetch($dateout_sr);
echo $dateout;
if(sqlsrv_has_rows($dateout_sr)===FALSE)

$dateout="NOROWS";

else

$dateout="HASROWS";


if($datein==="HASROWS")

$datein_q1="UPDATE clocked SET datein=GETDATE() WHERE EXISTS(SELECT TOP 1 datein FROM clocked WHERE datein='1900-01-01 00:00:00' AND userid=? ORDER BY datein DESC);";
$datein_qr1=sqlsrv_query($dbconnect,$datein_q1,$params) or die("Error update datein:".print_r(sqlsrv_errors(),true));
echo "Datein and out are HASROWS";

else if ($dateout==="HASROWS")

$dateout_q1="UPDATE clocked SET dateout=GETDATE() WHERE EXISTS(SELECT TOP 1 dateout FROM clocked WHERE dateout='1900-01-01 00:00:00' AND userid=? ORDER BY dateout DESC);";
$dateout_qr1=sqlsrv_query($dbconnect,$dateout_q1,$params) or die("Error update dateout:".print_r(sqlsrv_errors(),true));
echo "Dateout NOROWS";

else if ($datein==="NOROWS"&&$dateout==="NOROWS")

$datein_q2="INSERT INTO clocked(datein,userid) VALUES(GETDATE(),?);";
$datein_qr2=sqlsrv_query($dbconnect,$datein_q2,$params) or die("Error insert datein:".print_r(sqlsrv_errors(),true));
echo "Datein and Dateout NOROWS";

else

echo "ERROR your query may be broken!";

【问题讨论】:

检查结果集中的行数,然后再尝试从任何字段中提取任何值(在您的 php 中,而不是在 SQL 中)。 NULL = "未知值"。不是真/假/空。 item 文本默认为空。 if($item !== NULL) 如果 NULL 不为空,那么为什么这是日期/日期时间字段的唯一其他可接受值? @菲利普 datetime 接受尚未设置的值,即:unkown value: NULL @Philip 您如何建议设置空日期时间? 【参考方案1】:

我似乎通过添加 if(sqlsrv_has_rows 语句纠正了我的误报。

【讨论】:

以上是关于如何避免 SQL 查询检查 IS NULL 的误报?的主要内容,如果未能解决你的问题,请参考以下文章

是 cppcheck 的误报 containerOutOfBoundsIndexExpression 错误吗?

如何修复线性 SVM 的误报率?

如何计算分层 K 折交叉验证的不平衡数据集的误报率?

如何在相当平衡的二元分类中解决非常高的误报率?

fast-rcnn 对象检测中的误报

Helgrind (Valgrind) 和 OpenMP (C):避免误报?