我需要一个调用如下的存储过程:
search('foo bar')
搜索类似于:
SELECT FROM A, B
WHERE A.B_ID = B.ID
AND (A.f1 LIKE '%foo%' OR A.f2 LIKE '%foo%' OR B.f3 LIKE '%foo%')
AND (A.f1 LIKE '%bar%' OR A.f2 LIKE '%bar%' OR B.f3 LIKE '%bar%')
还有一些疑惑和疑问:
我无法将数组传递给过程,所以我唯一的选择是像示例中那样直接传递字符串 ('foo bar')?
所以我假设我必须在 SP 代码中进行拆分。我不知道如何,所以我搜索并找到了this solution .正在使用临时表和我认为很多笨拙的代码。真的有那么复杂吗?性能如何?
我不知道如何创建这样的动态查询。我想我必须遍历标记才能为每个人创建一个新的 WHERE 子句 block ,但我不确定如何执行此操作或者它是否是最佳解决方案。也许连接字符串然后制作准备好的语句更好?
谢谢。
注意:我使用 iBATIS (Java) 调用此例程。
最佳答案
您想要的是使用全文搜索 (FTS) - MySQL 的 native FTS 功能只能用于 MyISAM 表,以及 3rd 方 FTS(如 Sphinx)可供选择。这是 an online slideshow that's a decent intro & howto .
使用 MySQL native FTS,您的查询将类似于:
SELECT *
FROM A AS a
JOIN B AS b ON b.id = a.b_id
WHERE MATCH (a.f1, a.f2, b.f3) AGAINST ('foo bar');
动态 SQL 仍然是一个选项,具体取决于您希望/需要进行查询的强度。在考虑动态 SQL 之前,我会研究 FTS 产品...
关于java - MySQL 存储过程 : search for a variable number of strings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3225217/