Sql 是否可以将LIKE与一组字符串而不是单个元素一起使用?
我有一个专有名称列表(在一个表中),还有一个带有自由文本字段的表。我想检查该字段是否包含任何专有名称。如果只是一个,我可以做Sql 是否可以将LIKE与一组字符串而不是单个元素一起使用?,sql,sql-like,Sql,Sql Like,我有一个专有名称列表(在一个表中),还有一个带有自由文本字段的表。我想检查该字段是否包含任何专有名称。如果只是一个,我可以做 WHERE free_text LIKE "%proper_name%" 但是,如何为整个列表做到这一点?有更好的字符串函数可以用于列表吗 谢谢不,like没有那种功能 许多数据库都支持正则表达式,这使您可以随心所欲。例如,在Postgres中,这一点被表述为: where free_text ~ 'name1|name2|name3' 许多数据库还具有全文搜索功能,
WHERE free_text LIKE "%proper_name%"
但是,如何为整个列表做到这一点?有更好的字符串函数可以用于列表吗
谢谢不,
like
没有那种功能
许多数据库都支持正则表达式,这使您可以随心所欲。例如,在Postgres中,这一点被表述为:
where free_text ~ 'name1|name2|name3'
许多数据库还具有全文搜索功能,可以加快此类搜索
这两种功能都非常特定于您所使用的数据库。否,
类似的功能不具备该功能
许多数据库都支持正则表达式,这使您可以随心所欲。例如,在Postgres中,这一点被表述为:
where free_text ~ 'name1|name2|name3'
许多数据库还具有全文搜索功能,可以加快此类搜索
这两种功能都非常特定于您所使用的数据库。好吧,您可以在标准的连接中使用类似的,但是查询很可能会很慢,因为它会在每个自由文本中搜索每个适当的名称
例如,如果列表中有10个专有名称,并且某个free_text
值包含第一个名称,则服务器将继续处理其余9个名称
以下是查询:
SELECT -- DISTINCT
free_text_table.*
FROM
free_text_table
INNER JOIN proper_names_table ON free_text_table.free_text LIKE proper_names_table.proper_name
;
如果某个free_text
值包含多个专有名称,则该行将返回多次,因此您可能需要向查询中添加DISTINCT
。这取决于你需要什么
可以使用横向联接
来避免笛卡尔积(其中自由文本表
中的每一行与专有名称表
中的每一行进行比较)。最终结果可能比简单的变体更快。这取决于您的数据分布
下面是SQL Server语法
SELECT
free_text_table.*
FROM
free_text_table
CROSS APPLY
(
SELECT TOP(1)
proper_names_table.proper_name
FROM proper_names_table
WHERE free_text_table.free_text LIKE proper_names_table.proper_name
-- ORDER BY proper_names_table.frequency
) AS A
;
在这里,我们不需要DISTINCT
,对于free\u text\u table
中的每一行,结果中最多有一行(一行或零行)。由于TOP(1)
子句,Optimizer应该足够聪明,一旦发现第一个匹配项,就停止读取和处理专有名称表
如果您还可以以某种方式对自己的专有名称进行排序,并将最有可能找到的名称放在第一位,那么查询可能比简单的JOIN
更快。(在子查询中添加一个合适的ORDER BY
子句)。好吧,您可以在标准的连接中使用LIKE
,但是查询很可能会很慢,因为它会在每个自由文本中搜索每个专有名称
例如,如果列表中有10个专有名称,并且某个free_text
值包含第一个名称,则服务器将继续处理其余9个名称
以下是查询:
SELECT -- DISTINCT
free_text_table.*
FROM
free_text_table
INNER JOIN proper_names_table ON free_text_table.free_text LIKE proper_names_table.proper_name
;
如果某个free_text
值包含多个专有名称,则该行将返回多次,因此您可能需要向查询中添加DISTINCT
。这取决于你需要什么
可以使用横向联接
来避免笛卡尔积(其中自由文本表
中的每一行与专有名称表
中的每一行进行比较)。最终结果可能比简单的变体更快。这取决于您的数据分布
下面是SQL Server语法
SELECT
free_text_table.*
FROM
free_text_table
CROSS APPLY
(
SELECT TOP(1)
proper_names_table.proper_name
FROM proper_names_table
WHERE free_text_table.free_text LIKE proper_names_table.proper_name
-- ORDER BY proper_names_table.frequency
) AS A
;
在这里,我们不需要DISTINCT
,对于free\u text\u table
中的每一行,结果中最多有一行(一行或零行)。由于TOP(1)
子句,Optimizer应该足够聪明,一旦发现第一个匹配项,就停止读取和处理专有名称表
如果您还可以以某种方式对自己的专有名称进行排序,并将最有可能找到的名称放在第一位,那么查询可能比简单的JOIN
更快。(在子查询中添加一个合适的ORDER BY
子句)。只需循环使用专有名称即可。如果没有所使用的特定DBMS的标记,这个问题很难回答。添加时会显示一个很大的建议,建议还为特定DBMS添加一个标记,因为它们之间的功能和语法不同。这个建议是有原因的;你应该现在就发布并添加标签。如果没有它,你将花费更长的时间来获得答案,并浪费那些试图回答却发现它在你的DBMS上不起作用的人的时间。我将只循环使用专有名称。如果没有你正在使用的特定DBMS的标签,这个问题很难回答。添加时会显示一个很大的建议,建议还为特定DBMS添加一个标记,因为它们之间的功能和语法不同。这个建议是有原因的;你应该现在就发布并添加标签。如果没有它,您将花费更长的时间来获得答案,并浪费那些试图回答问题却发现它在您的DBMS上不起作用的人的时间。