我有一个包含不同状态的数据库,我试图使用id为smallint过滤这些状态。
为此,我使用IN()语句:
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)
现在,当输入结果为12
时,@States
的值应为1,2,3
,我希望将其作为in(1,2,3)
直接进入in语句,但这只是返回状态序列中的第一个数字,这是我不想要的。
任何人都知道为什么这不起作用?
答案 0 :(得分: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)