2016-05-05 9 views
0

私はさまざまな状態を保持するデータベースを持っていますが、私はsmallintであるidを使ってこれらの状態をフィルタリングしようとしています。入力は@States12値は、私がin(1,2,3)としてストレートでのステートメントに行くだろう期待していた1,2,3あるべきと言うとき今MySQL IN()文でのvarcharの使用

Declare StateList varchar(150); 
Declare States varchar(150); 
set @StateList = State; 
set @States = ''; 

if (@StateList Like '%1%')then 
    if(LENGTH(@States) > 0) then set @States := Concat(@States, ',1,2'); 
    else set @States := Concat(@States, '1,2'); 
    end if; 
end if; 
if(@StateList Like '%2%')then 
    if(LENGTH(@States) > 0) then set @States := Concat(@States, ',3'); 
    else set @States := Concat(@States, '3'); 
    end if; 
end if; 
if(@StateList Like '%3%')then 
    if(LENGTH(@States) > 0) then set @States := Concat(@States, ',4,5'); 
    else set @States := Concat(@States, '4,5'); 
    end if; 
end if; 
Select * 
from ticket_state 
Where ticket_state in (@States) 

:私はIN()ステートメントを使用しています。これを行うために

しかし、これはシーケンスの最初の数値を状態のために返すだけです。これは私が望まないものです。

これはなぜ動作しないのですか?

+0

@Statesは、varchar型の値のリストがあるように私には思えます。つまり、それぞれをアポストロフィで囲む必要があります。 – knagaev

+0

ちょっとしたコメント:ユーザー変数宣言(@変数名= ...を設定)を複合ステートメント変数宣言(variable_name宣言)と混在させています。最初に2つの宣言ステートメントは必要ありません。これらの変数はコード内で使用していません。 – Shadow

答えて

2

ステートメントはIN(1,2,3)のようになりますが、これはあなたがここにいるものではありません。あなたは単一の文字列を持っているので、それはのようですIN('1,2,3')

あなたが望むものを達成するためにFIND_IN_SET関数を使用することができます。

例:

SELECT FIND_IN_SET(2, '1,2,3'); -- returns 2 

試してみてください。

SELECT * 
FROM ticket_state 
WHERE FIND_IN_SET(ticket_state,@States) 
+0

ありがとうございます! –