SQL中的数学运算符不排除“NA”值

问题描述:

我正在使用下面的代码在数据库中搜索某个列中输入值之上或之下的条目。SQL中的数学运算符不排除“NA”值

if (isset($_POST["abovebelow"]) && $_POST["abovebelow"] == "Above"){ 

    $operator = ">"; 

} 

elseif (isset($_POST["abovebelow"]) && $_POST["abovebelow"] == "Below"){ 

    $operator = "<"; 

} 

elseif (!isset($_POST["abovebelow"])){ 

    $operator = "LIKE"; 
    $value = "%"; 

} 

$result = $mysqli->prepare("SELECT t.column FROM table t WHERE t.value".$operator." (?);"); 

$result->bind_param($value); 
$result->execute(); 

对于这个数据集,t.value是-1,0,1或NA。当我将查询设置为-1或0以上时,NA值也显示出来。但是当我将它设置为低于1或0时,不会显示NA值。为什么是这样?有什么我可以添加到查询,以防止NA值显示上面或下面选择时(但没有选择时没有)?

我正在考虑上述问题的方式是:有没有办法在查询中有不同数量的参数?我在考虑如果选择上面或下面,那么查询可以附加“AND t.value!='NA'”。这也有助于有一个复选框允许或不允许用户根据上述/下面的标准判断是否有“NA”值。

+0

如何在数据库中存储'NA'值?它是否为'NULL'? –

+0

如果你只是想要不同的查询,你可以将它移动到if语句中。 – aron9forever

+0

NA值存储为“NA”不为空。我不能把它放在if语句中,因为上面是一个简化版本。我有多个运算符和值,不想写所有可能的组合。 – Steven

使用从雅科的回答思路,我加

$operator = "<> 'NA' and t.value >"; 

到每个运营商的一部分,而不是添加到查询。这为上面和下面的部分提供了灵活性,以包括或不包括'NA'

您可以添加额外的WHERE子句来过滤这些值。假设你的NA值存储为一个字符串('NA'),您可以过滤它们像这样:

SELECT t.column FROM table t WHERE t.value<> 'NA' AND t.value".$operator." (?); 

如果你想显示在您可以使用下面的查询忽略了未签的情况下NA值检查NA当操作员设置为LIKE

SELECT t.column FROM table t WHERE (t.value <> 'NA' OR "$operator"="LIKE") AND t.value".$operator." (?); 

编辑:第二种方法完全不是那么回事按照史蒂芬评论,看到史蒂芬的自己的答案为实现这个的正确途径。

+0

NA值不会显示在未勾选的情况下,虽然:( – Steven

+0

我添加了第二个查询,它会在未检查的情况下显示NA值,如果'$ operator'忽略了对NA的检查设置为'LIKE' – Jaco

+0

,这给出了“在$ result-> bind_param($ value);部分上调用非对象成员函数bind_param()”的错误。 – Steven