Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否可以将LIKE与一组字符串而不是单个元素一起使用?_Sql_Sql Like - Fatal编程技术网

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上不起作用的人的时间。