[英]SET a variable in SELECT statement - MySQL
我正在使用此代碼有錯誤:
SET @rejects = '';
SELECT *
FROM list
WHERE maker = 1
AND by_ids IN ('10','11')
AND country LIKE '%I%'
AND (
src IS NULL
|| src NOT IN (@rejects)
AND checkSrc(src) = 'yes'
AND SET @rejects = CONCAT(@rejects,',',src)
);
是什么導致了這個問題?
問題是你不能在一個語句中混合select
和set
,肯定會出現語法錯誤:
select*from t where 1 and set@a=1;
錯誤1064(42000):您的SQL語法有錯誤; 檢查與MySQL服務器版本對應的手冊,以便在第1行的'set @ a = 1'附近使用正確的語法
如果要在select
進行set
,請使用冒號等於語法。 改變這個:
select*from t where 1 and set@a=1;
成:
select*,@a:=1 from t where 1;
以下是更新每行變量的方法 :
create table t(id int); insert t values(1),(2),(3);
set@a=0;
select@a:=id from t;
+--------+ | @a:=id | +--------+ | 1 | | 2 | | 3 | +--------+
你甚至可以做concat
:
set@a='0';
select @a:=concat(@a,',',id)from t;
+-----------------------+ | @a:=concat(@a,',',id) | +-----------------------+ | 0,1 | | 0,1,2 | | 0,1,2,3 | +-----------------------+
或者在沒有前導0
情況下concat
:
set@a='';
select @a:=concat(@a,if(@a='','',','),id)from t;
+------------------------------------+ | @a:=concat(@a,if(@a='','',','),id) | +------------------------------------+ | 1 | | 1,2 | | 1,2,3 | +------------------------------------+
...你永遠不應該為用戶變量賦值並在同一語句中讀取值...
...你可能得到你期望的結果,但這不能保證 。
... 未定義涉及用戶變量的表達式的評估順序。
這在Xaprb上也有提及。
最后,如果您正在做一些古怪的事情,例如為變量等分配不同的值類型,請查看手冊以確保您了解復雜的機制。
然后你可以寫這樣的查詢。
SET @rejects = '';
SELECT @rejects = CONCAT(@rejects,',',src) FROM list WHERE maker = 1 AND by_ids IN ('10','11') AND country LIKE '%I%' AND
(src IS NULL OR src NOT IN (@rejects) AND checkSrc(src) = 'yes');
SELECT @rejects;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.