簡體   English   中英

在SELECT語句中設置一個變量 - MySQL

[英]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)
    );

是什么導致了這個問題?

問題是你不能在一個語句中混合selectset ,肯定會出現語法錯誤:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM