在MySQL中,WHERE子句中可以使用臨時變數嗎?
WHERE
例如,在以下查詢中:
SELECT `id`, @var := `id` * 2 FROM `user`
@var 已成功設定為 `id` 值的兩倍
但是,如果我嘗試過濾結果集以僅包含 @var 小於 10 的結果:
SELECT `id`, @var := `id` * 2 FROM `user` WHERE @var < 10
然後我沒有得到任何結果。
如何根據@var的值過濾結果?
問:MySQL臨時變數可以在WHERE子句中使用嗎?
是的。 MySQL 使用者定義的變數(例如 @var)可以在 WHERE 子句中引用。
@var
使用者定義的變數是對目前在計算表達式時指派給它的任何值的參考。
在查詢中,WHERE 子句中的謂詞先於 SELECT 清單中的運算式進行計算。
也就是說,在存取行時,@var 將被計算為布林表達式;對於每個候選行,都會計算表達式,並且僅當結果為TRUE 時才傳回該行。
如果您要為該變數提供一個數值大於或等於 10 的值,則在執行該語句之前,將傳回所有行。
問:如何根據@var的值過濾結果?
你真的不能。 (實際上,這就是您的原始查詢正在執行的操作。)
您可以在 @var 之外的其他表達式中包含謂詞;這些表達式可以從分配給 @var 的值派生出來。
作為一種選擇,您可以在 SELECT 清單中傳回一個表達式,然後使用 HAVING 子句來過濾傳回的行。 (注意:HAVING 子句在結果集準備好之後進行計算;與 WHERE 子句不同,後者在訪問行時進行計算。 )
HAVING
另一個選擇是使用內聯視圖來準備結果集,然後外部查詢可以在傳回的表達式上使用 WHERE 子句。
但嚴格來說,這些方法都對 @var 以外的表達式應用謂詞;他們實際上並沒有對 @var# 中的值進行測試。
您需要指派一個別名,並在 HAVING 子句中測試它:
SELECT id, @var := id * 2 AS id_times_2 FROM user HAVING id_times_2 < 10
請注意,如果您只是使用公式進行過濾,而不是將內部結果從一行傳遞到下一行,則根本不需要該變數。你可以寫:
SELECT id, id * 2 AS id_times_2 FROM user HAVING id_times_2 < 10
問:MySQL臨時變數可以在WHERE子句中使用嗎?
是的。 MySQL 使用者定義的變數(例如
@var
)可以在 WHERE 子句中引用。使用者定義的變數是對目前在計算表達式時指派給它的任何值的參考。
在查詢中,WHERE 子句中的謂詞先於 SELECT 清單中的運算式進行計算。
也就是說,在存取行時,
@var
將被計算為布林表達式;對於每個候選行,都會計算表達式,並且僅當結果為TRUE 時才傳回該行。如果您要為該變數提供一個數值大於或等於 10 的值,則在執行該語句之前,將傳回所有行。
問:如何根據
@var
的值過濾結果?你真的不能。 (實際上,這就是您的原始查詢正在執行的操作。)
您可以在
@var
之外的其他表達式中包含謂詞;這些表達式可以從分配給@var
的值派生出來。作為一種選擇,您可以在 SELECT 清單中傳回一個表達式,然後使用
HAVING
子句來過濾傳回的行。 (注意:HAVING
子句在結果集準備好之後進行計算;與WHERE
子句不同,後者在訪問行時進行計算。 )另一個選擇是使用內聯視圖來準備結果集,然後外部查詢可以在傳回的表達式上使用 WHERE 子句。
但嚴格來說,這些方法都對
@var
以外的表達式應用謂詞;他們實際上並沒有對@var
# 中的值進行測試。您需要指派一個別名,並在
HAVING
子句中測試它:請注意,如果您只是使用公式進行過濾,而不是將內部結果從一行傳遞到下一行,則根本不需要該變數。你可以寫: