我在MySQL中查询时遇到了困难。
我正在使用Delphi XE,我正在向MySQL发送带有一些参数的查询。以下是查询的示例:
SELECT * FROM users u WHERE u.id IN (:idUsers);
':idUsers'是接收我用Delphi发送的参数的变量,这是一个包含格式的字符串,例如:1,2,3
问题是,使用此字符串,我只收到第一个用户(id = 1)。从我所看到的,就像MySQL一样,在我发送的字符串的开头和结尾添加一些引号(''),就好像它是'1,2,3'而不是1,2,3。我试过这个选择:
SELECT * FROM users u WHERE u.id IN ('1,2,3');
它确实只返回第一个用户..
我在MSSQL中有一个函数正在拆分我发送的字符串并返回一个临时表,但我们最近切换到MySQL,从我读到的,MySQL不允许返回一个表。
任何人都知道如何解决这个问题?我一直在废弃网络寻找答案,但没有找到解决这一具体问题的方法。
感谢您的帮助。
答案 0 :(得分:10)
参数不起作用;他们不知道你想要提供的是一个以逗号分隔的值列表。如果您设置ParamByName('WhatEver').AsString
或Value
,则认为您的意思是带引号的字符串,其中包含该参数中的所有内容。所以它正在做的正是 - 它正在传递IN ('1, 2, 3')
,而不是预期的IN (1, 2, 3)
。
您需要返回自己解析它并使用临时表,或者在执行查询之前动态构建WHERE
子句并将其连接起来。 (实际上,您可以动态构建查询,为IN
子句中的每个项创建一个新参数,然后循环并为每个动态创建的参数赋值,但这会很快变得非常难看。)
答案 1 :(得分:0)
如果IN子句中有可变数量的参数,您可以在MYSQL中构建一个临时表(只包含一个名为ID的列),将参数值加载到临时表中,然后执行以下操作: / p>
SELECT * FROM users u WHERE u.id IN (SELECT ID FROM TEMPTABLE);
只要TEMPTABLE只包含您要查询的值,就可以接受表空间扫描。
然后,您可以拥有可变数量的值。您还可以使表永久化,并存储参数。为User添加一列,每个用户都可以存储他们各自的参数。