java - MySQL 存储过程 : search for a variable number of strings

标签 java mysql stored-procedures ibatis

我需要一个调用如下的存储过程:

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%')

还有一些疑惑和疑问:

  1. 我无法将数组传递给过程,所以我唯一的选择是像示例中那样直接传递字符串 ('foo bar')?

  2. 所以我假设我必须在 SP 代码中进行拆分。我不知道如何,所以我搜索并找到了this solution .正在使用临时表和我认为很多笨拙的代码。真的有那么复杂吗?性能如何?

  3. 我不知道如何创建这样的动态查询。我想我必须遍历标记才能为每个人创建一个新的 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/

相关文章:

Mysql,双重连接两次使用同一张表,但间接

mysql - 使用 MySQL JOINS 从两个表中检索记录

php - IF 规则 $_POST PHP - MYSQL

PHP/mySQL - 当新用户提交数据时定期重新计算基准值

java - GWT 按钮中的图像

java - 如何捆绑自定义 hadoop-streaming.jar

java - Swagger 2 如何仅从请求示例中排除属性

Java泛型和继承: am I trying to be too clever?

sql-server - 从存储过程执行 SQL Server SSIS 包

sql - 返回连接结果的 Postgresql 函数