2012-04-10 84 views
8

我想知道是否可以根據某些變量值以優雅的方式縮短查詢。mysql - if value = 0縮短語句的位置

例如:我有一個名爲值和$var = 0我想發出一個查詢,看起來像這樣:

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

但是煥的是$ var = 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

我正在處理這個問題,但是請刪除原始'$ query'中的'AND id = $ var'部分。 – 2012-04-10 14:26:44

+0

woops ..一些複製粘貼錯誤..完成 – 2012-04-10 14:33:57

+1

不錯,我已經提出了您的答案。 – 2012-04-10 14:35:24

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,我仍然有一個表達式選擇id = 0的產品。我不想要它 - 我想如果var = 0打印所有產品,並且如果var> 0只與id = var – Kalreg 2012-04-10 16:59:22

+0

然後它應該工作。關鍵部分是(id ='$ var'或'$ var'= 0)。如果id ='$ var'或'$ var'= 0,這將返回true。通過將$ var設置爲0,它應該返回所有內容。 – ESG 2012-04-10 17:38:47

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

因此,如果您使用的是

如果還是CASE

你爲什麼不以你的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 

我想這會解決您的問題。 但作爲個人建議嘗試做一個查詢。即使有變數。我們不相信根據條件改變標準查詢。

還是你的願望和你的願望

乾杯!

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 { 
... 
} 
... 

這一切都取決於你的需求,但無論這個或紙蝙蝠的解決方案複製查詢代碼。