2011-05-21 85 views
0

我正在寻找一种在JasperReport中使用IN关键字的方法。我的查询看起来像:MySQL:拆分字符串SQL用于WHERE子句

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"转换为有效的查询,因此会考虑分别考虑每个值145,45, 452

所有帮助表示赞赏。

回答

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

但是,此查询将始终导致表fullscan。所以我建议你重写你的代码并使用适当的语法。

+0

不错。解决方案正在以这种方式工作,因为此报告只生成一年两次,所以我不介意fullscan。 – Adnan 2011-05-21 13:39:51

1

你有两个选择。更常见的,是重写查询像这个:

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

我不知道对方是有效的MySQL,但在PostgreSQL的正常工作。它是使用解析字符串转换为整数集的不可变的功能,而是使用:

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

thanx @Denis,不幸的是,在MySQL中没有split_to_int。 – Adnan 2011-05-21 13:38:02

+0

@Adnan:我会说*幸运*没有这样的功能;-)否则没有人会关心规范化的数据库模式;-) – zerkms 2011-05-21 13:39:47

+0

@Adnan:由此,我的意思是你会自己写这个函数if可以在MySQL中编写设置返回函数。 – 2011-05-21 13:47:49

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

只需使用$ P之间

$P!{MY_CIDS} 

感叹号 { MY_CIDS})。

碧玉现在concatinate的字符串是这样的:

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

导致:

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

我花了很长时间才能拿到,但现在我的作品“