2016-02-25 91 views
1

我正在使用下面的代碼在數據庫中搜索某個列中輸入值之上或之下的條目。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

回答

1

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

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

到每個運營商的一部分,而不是添加到查詢。這爲上面和下面的部分提供了靈活性,以包括或不包括'NA'

2

您可以添加額外的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