SQL使用“in”查找子字符串

时间:2016-10-27 08:08:31

标签: mysql

所以,当我想选择内部sql语句中存在的所有ID时,我们知道这个有效吗

Select * 
FROM TableA 
WHERE Column1 IN (SELECT column2 FROM tableB WHERE = condition)

如果Column1是一个长字符串,我需要做什么样的语法,我需要检查某个子字符串是否存在。

Ex Column1 = "text text text text 12345"其中12345是内部sql语句给出的ID列表中的ID

基本上我试图根据另一个表中的ID列表来检测另一个表中的一个字符串中是否存在ID。

我应该在SQL中执行此操作还是让服务器端代码执行此操作?

2 个答案:

答案 0 :(得分:3)

这通常使用LIKE运算符完成:

SELECT ... FROM ... WHERE Column1 LIKE "%12345%";

然而,这非常慢,因为它基于子串匹配。要提高性能,您必须创建一个存储单个单词的搜索索引表。这种索引通常由触发器定义维护:每当条目改变时,触发器也改变提取到搜索索引表中的单词集。在这样的索引表中搜索显然很快,并且可以基于索引中的单词与表中原始条目之间的JOIN关系,通过n:1与原始表结合使用。

答案 1 :(得分:1)

而不是使用fieldname like '%needle%'搜索,因为它无法使用索引而速度极慢,所以在给定列上创建fulltext index并使用fulltext search来查找匹配的子字符串。

以下代码摘录引自MySQL文档:

CREATE TABLE articles (
      id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
      title VARCHAR(200),
      body TEXT,
      FULLTEXT (title,body)
    ) ENGINE=InnoDB;

SELECT * FROM articles
    WHERE MATCH (title,body)
    AGAINST ('database' IN NATURAL LANGUAGE MODE);

带语法的catch是在上面的代码示例中查找的单词列表('database')必须是字符串文字,它不能是子查询。您需要在调用sql语句的应用程序中组合关键字列表。