10

エラーのあるこのコードを使用しています:

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)
    );

問題の原因は何ですか?

4

2 に答える 2

15

select問題は、混在させることができずset、1 つのステートメントで構文エラーが確実に発生することです。

select*from t where 1 and set@a=1;

エラー 1064 (42000): SQL 構文にエラーがあります。1行目の「set@a=1」付近で使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください

set内で実行する場合は、コロンと等号の構文selectを使用します。これを変える:

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               |
+-----------------------+

またはconcat先頭なし0:

set@a='';
select @a:=concat(@a,if(@a='','',','),id)from t;
+------------------------------------+
| @a:=concat(@a,if(@a='','',','),id) |
+------------------------------------+
| 1                                  |
| 1,2                                |
| 1,2,3                              |
+------------------------------------+

ただし、マニュアルには、これは危険であると明示的に記載されています。リンク

...ユーザー変数に値を割り当てて、同じステートメント内で値を読み取らないでください...

...期待どおりの結果が得られる可能性がありますが、これは保証されません

...ユーザー変数を含む式の評価順序は 未定義です。

これはXaprbでも言及されています。

最後に、変数に異なる値の型を割り当てるなどの風変わりなことをしている場合は、マニュアルをチェックアウトして、複雑なメカニズムを理解していることを確認してください。

于 2015-04-01T13:16:45.920 に答える
2

次に、このようにクエリを記述します。

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;
于 2013-03-22T22:50:26.153 に答える