2016-02-25 1 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» в MySQL? Это '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." (?); 

EDIT: второй подход не совсем работает в соответствии с комментариями Стивена см собственный ответ Стивена на правильном пути реализации этого.

+0

Значения NA не отображаются в незарегистрированном случае :( – Steven

+0

Я добавил второй запрос, который отображает значения NA в случае, когда он не проверен. Он игнорирует проверку на 'NA', если' 'operator' установлен на 'LIKE' – Jaco

+0

, это дает« Вызов функции-члена bind_param() при ошибке «без объекта» в части $ result-> bind_param ($ value) ;. – Steven

Смежные вопросы