mysql将一个以逗号分隔的数字字符串转出数字 10C

select * from user where id in (Ids);

说明,Ids是存储过程传过来的一个拼接的数字字符串,(1,2,3,4,5),现在的问题是。这样in之后
它只会找id=1的记录。后面的记录找不出来。不知为何。还请各位大神指点
,为什么会这麼拼接。是为我的id是一个临时表里。不能用来关联。因为存储过程里有狠多
地方用到Ids,临时表只能select一次。所以用了这个方法。
这是拼接语句varCampId是动态查询的。根据条件。可能一个。可能多个。
SET @tmpCampIds = CONCAT(@tmpCampIds, varCampId, ',');

7个回答

要把ids分开传进来,否则mysql会认为它是个整体,也就是一个id
例如: select * from user where id in (Id1,Id2,Id3);

qq_36626927
RosYuina 回复凌丿宇o: 对,就是动态传,把你sql和参数用java方法写成动态的,具体怎么写就需要根据你项目框架来写了
2 年多之前 回复
TyroneSY
凌丿宇o 我的这个Id串不是固定的啊。分开传。不知道具体会有多少个啊。所以才会想着动态拼接啊。
2 年多之前 回复

是你拼接的字符串的问题,你可以试着在mysql里面直接运行sql语句:
第一句:select * from user where id in (1,2,3,4,5);
第二句:select * from user where id in ('1,2,3,4,5');

第一句是没问题的,第二局只会输出id是1的数据,区别就在于,in后面的值一个是正常输入的数字,另一个是字符串,数据类型已经变了。

qq_36588972
被遗忘的我怀念的 回复TyroneSY: 这样就分开了,我测试了一下没问题
2 年多之前 回复
qq_36588972
被遗忘的我怀念的 回复TyroneSY: 所以不能直接拼接成字符串,字符串是一个整体,要这样拼接select * from notes_users where user_id in ('1','2','3','4','5');
2 年多之前 回复
TyroneSY
凌丿宇o 对的。我的结果就是妳的第二种结果
2 年多之前 回复
qq_36588972
被遗忘的我怀念的 注意第二句的in后面我加了单引号
2 年多之前 回复

可以专门写一个函数,传入一个参数,函数里面直接拼接参数里面的值

TyroneSY
凌丿宇o 这也是一个思路。
2 年多之前 回复

这种你可以用预编译
SET @sel_1 = 'select * from ls_boutique where rec_id in ';

SET @sel_2 = '(1,2)';
SET @sentence = CONCAT(@sel_1,@sel_2);
PREPARE stmt FROM @sentence;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

xl5115105
xl5115105 回复TyroneSY: sql可以同时执行多条啊
2 年多之前 回复
TyroneSY
凌丿宇o 这个是存储过程在用。所以里面的语句狠长的。。。。千行级的。。。。。那样狠难搞啊。
2 年多之前 回复

试试FIND_IN_SET(1,'1,2,3,4,5')这个函数

TyroneSY
凌丿宇o 不行。试过了。
2 年多之前 回复

反向思维not in

TyroneSY
凌丿宇o 那样数据大了。慢了。。。
2 年多之前 回复

你传进来的只是第一个字符串,select * from user where id in (Ids);变成select * from user where id in (‘1’,‘2’,‘3’,‘4’,‘5’);
不行的话select * from user where id in (int(‘1’),int(‘2’),int(‘3’),int(‘4’),int(‘5’)); 我用的是db2

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐