MySQL:在WHERE子句中使用的拆分字符串SQL

时间:2011-05-21 13:25:19

标签: mysql sql jasper-reports

我正在寻找一种在JasperReport中使用IN关键字的方法。我的查询如下:

SELECT * FROM table_name WHERE CID IN (145,45, 452);

在jasper报告中我可以设置这个;

SELECT * FROM table_name WHERE CID IN ($P{MY_CIDS});

从我的Java中我将$P{MY_CIDS}作为String发送,因此我的查询将如下所示

SELECT * FROM table_name WHERE CID IN ("145,45, 452");

我的问题是如何将SQL "145,45, 452"转换为有效查询,以便分别考虑每个值14545452

感谢所有帮助。

3 个答案:

答案 0 :(得分:3)

WHERE FIND_IN_SET(CID, "145,45,452")

但是这个查询总是会导致表格扫描。因此,我建议您重写代码并使用正确的IN (A, B, C)语法。

答案 1 :(得分:1)

你有两种选择。更常见的是改写你的查询,而不是:

SELECT * FROM table_name WHERE CID IN (?, ?, ?, ..., ?);

我不确定对方是否对MySQL有效,但它在PostgreSQL中运行良好。它是使用一个不可变函数将字符串解析为一组整数,而不是使用:

SELECT * FROM table_name WHERE CID IN (split_to_int(?));

答案 2 :(得分:0)

SELECT * FROM table_name WHERE CID IN ($P!{MY_CIDS});

只需使用

$P!{MY_CIDS}

($ strong和{MY_CIDS}之间的感叹号)。

Jasper现在将这样的字符串连接起来:

"SELECT * FROM table_name WHERE CID IN ("
+"145,45,452"
+")";

导致:

SELECT * FROM table_name WHERE CID IN (145,45,452);

花了很长时间才得到它,但现在它对我有用。“