2012-04-10 5 views
8

Интересно, возможно ли укоротить запрос в зависимости от некоторого значения переменной элегантным способом.mysql - if value = 0 shorten where statement

Например: у меня есть значение имени $var = 0, и я хотел бы отправить запрос, который выглядит следующим образом:

$query = "SELECT id, name, quantity FROM products WHERE quantity > 100"; 

Но Whan в $ вар = 1 Я хотел бы отправить запрос, как это :

$query = "SELECT id, name, quantity FROM products WHERE quantity > 100 AND id = '$var'"; 

Так что в зависимости от значения $ var я хочу выполнить один из запросов. Они отличаются только последним выражением. Я нашел два возможных решения, но они не изящны, и мне они вообще не нравятся.

Один сделано в PHP:

if ($var == 0) { 
    $query_without_second_expression 
} else { 
    $query_with_second_expression 
} 

Второй выполнена в MySQL:

SELECT WHEN '$var' <> 0 THEN id, name, quantity 
FROM products WHERE quantity > 100 AND id = '$var' ELSE id, name, quantity 
FROM products WHERE quantity > 100 END 

, но я не люблю его - каждая идея удваивает запросы в некоторой whay. Могу ли я сделать что-то вроде этого?

SELECT id, name, quantity 
FROM products WHERE quantity > 100 
CASE WHEN $var <> 0 THEN AND id = '$var' 

Это намного короче и при необходимости добавляет часть запроса. Конечно, реальный запрос намного сложнее, и более короткое утверждение будет действительно ожидаемым. У кого-то есть идея?

ответ

5

Если я хорошо понимаю ..

$query = "SELECT id, name, quantity FROM products WHERE quantity > 100"; 
if ($var != 0) { 
    $query .= " AND id = '$var'"; 
} 

вам это нравится?

+1

Я работал над этим, но, пожалуйста, удалите часть 'AND id = $ var' из исходного' $ query' –

+0

woops .. некоторые копии вставки ошибок .. done –

+1

Ницца, я уже поддержал ваш ответ. –

1

Если они отличаются только в дополнительных где-заявления, я бы, вероятно, все еще остаются в PHP и выполните следующие действия:

$conditions = array(); 
$conditions[] = "(quantity > 100)" 

if ($var == 0) 
    $conditions[] = "(id = '$var')"; 

if (some-other-expression) 
    $conditions[] = "(myfield = 'foo' OR myfield = 'bar')"; 

$sql = " 
    SElECT id, name, quantity 
    FROM products 
    WHERE 
"; 
$sql .= $conditions.join(" AND "); 

/Карстен

1

Я не разработчик PHP (это PHP, правильно?), но не проще ли построить запрос из конкатенированной строки?

Псевдо-код:

$my_query = "SELECT id, name, quantity FROM products WHERE quantity > 100" 

if ($var != 1) 
    $my_query = $my_query + " AND id = '$var'"; 
end if; 

/*go ahead with your query*/ 
1

Вы можете сделать это:

SELECT id, name, quantity 
FROM products 
WHERE 1 = 1 
     AND ($q IS NULL OR quantity > $q) 
     AND ($var IS NULL OR id = $var) 

Если вы хотите только первое условие, чтобы запустить затем передать $q = 100 и $var = NULL, поэтому второе условие будет проигнорировано. И для второго запроса передайте $q = 100 и $var = id value, и вы получите второй запрос.

2

Вы могли так что-то вроде этого на стороне SQL:

"SELECT id, name, quantity FROM products WHERE quantity > 100 AND (id = '$var' OR '$var' = 0) 

Но производительность может повлиять. Я бы предложил создать соответствующий запрос на стороне PHP.

+0

Мне больше нравится ваш пример, но он не работает в моем проекте. если $ var = 0 i все еще имеет выражение, которое выбирает продукты с id = 0. Я не хочу этого - я хочу, чтобы var = 0 печатал все продукты, и если var> 0 только с id = var – Kalreg

+0

Тогда он должен работать , Ключевой частью является (id = '$ var' OR '$ var' = 0). Это вернет true, если id = '$ var' или if '$ var' = 0. Установив $ var в 0, он должен вернуть все. – ESG

1

Я хотел бы использовать для этого тройного:

$query = "SELECT id, name, quantity FROM products WHERE quantity > 100" . ($var != 0 ? " AND id = '$var'" : ''); 
1

Я являюсь парень Oracle, но вы могли бы использовать функцию IF() в ваших ограничений, например:

SELECT id, name, quantity 
    FROM products 
WHERE quantity > 100 
    AND id = IF('$var'=0,'%','$var'); 

'%' является подстановочным знаком, который будет соответствовать чему угодно, эффективно игнорируя второе выражение.

1

Так что, если вы используете

If или СЛУЧАЙ

Почему вы не использовать их в SQL запросе. Было бы некоторые, как

if ($var == 0) { 
$query_without_second_expression 
} 
else 
{ 
$query_with_second_expression 
} 

Но в вас SQL запросов.

DECLARE @var int 
if(@var=1) 
BEGIN 
    query 1 
END 

else 
BEGIN 
    query 2 
end 

Я думаю, это решит вашу проблему. Но в качестве личного совета попробуйте сделать один запрос. Даже с переменной. Мы не верим в изменение стандартного запроса в зависимости от условий.

По-прежнему ваше желание и ваше желание

Cheers !!

1

Для этой конкретной проблемы перейдите к простому условию добавления Paper-bat append snippet.

Однако, если у вас есть совершенно разные утверждения where, рассмотрите возможность добавления соответствующей инструкции where к запросу, как только вы знаете, что хотите. Например,

$query = "SELECT id, name, quantity FROM products "; 
if ($var == 0) { 
    $query .= "quantity > 100"; 
} elseif { 
    $query .= "quantity > 120 AND id = '$var'"; 
} elseif { 
... 
} 
... 

Все зависит от ваших потребностей, но ни это или решения бумажно-летучей мыши не дублировать код запроса.