查询一个表,其中字段包含给定文本字符串的任意顺序


Querying a table where the field contains any order of given text strings

我想查询如下表:

我有一个名为"类别"的字段,我的输入匹配包含N个单独的单词。我希望查询匹配包含所有N个单词的所有行,但可以按任何顺序匹配。

例如,如果字段类别包含"你好,早安世界",则我的输入查询可以包含"你好早上"、"好"或"世界你好",并且都与查询匹配。

如何制定这样的SQL表达式?

此外,如果查询可以不区分大小写,那也很好。

如果您使用MySQL,您可以使用布尔全文搜索功能来实现这一点。你可以在每个术语前面加一个+,然后只返回所有术语的结果,按任何顺序。您需要确保包含类别字段的列上指定了全文索引才能正常工作。其他数据库引擎可能也有类似的功能。例如,假设类别列上有一个全文索引,您可能会执行以下操作。。。

SELECT * FROM myTable WHERE MATCH (category) AGAINST ('+term1 +term2 +term3' IN BOOLEAN MODE);

我会避免使用"LIKE"运算符,正如其他人所建议的那样,你必须担心大小写混合的头痛问题,如果你有一个大型数据库,在LIKE搜索词的前面使用%,会导致全表扫描,而不是使用对性能不利的索引。

我不会为您编写构建此查询的循环。这会完成工作,但效率会很低。

SELECT * FROM table 
  WHERE (
    TOUPPER(category) LIKE '*HELLO*' AND
    TOUPPER(category) LIKE '*GOOD*' AND
    TOUPPER(category) LIKE '*MORNING*' AND
    TOUPPER(category) LIKE '*WORLD*'
    );

您也可以将REGXes与SQL结合使用进行研究。