MySQL错误的输出与IN子句和参数

时间:2011-12-06 20:34:56

标签: mysql delphi parameters delphi-xe

我在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不允许返回一个表。

任何人都知道如何解决这个问题?我一直在废弃网络寻找答案,但没有找到解决这一具体问题的方法。

感谢您的帮助。

2 个答案:

答案 0 :(得分:10)

参数不起作用;他们不知道你想要提供的是一个以逗号分隔的值列表。如果您设置ParamByName('WhatEver').AsStringValue,则认为您的意思是带引号的字符串,其中包含该参数中的所有内容。所以它正在做的正是 - 它正在传递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添加一列,每个用户都可以存储他们各自的参数。