sql-server - 从另一个表中选择具有子字符串的记录

标签 sql-server sql-server-2008 stored-procedures

我有这两个表:

data    
id   |email    
_   
1    |xxx@gmail.com    
2    |yyy@gmial.com    
3    |zzzgimail.com 

errors    
_    
error    |correct    
@gmial.com|@gmail.com    
gimail.com|@gmail.com    

如何从 data 中选择所有带有电子邮件错误的记录?谢谢。

最佳答案

SELECT d.id, d.email
FROM data d
    INNER JOIN errors e ON d.email LIKE '%' + e.error

会这样做,但是在要匹配的值的开头使用通配符执行 LIKE 会阻止使用索引,因此您可能会看到性能不佳。

最佳方法是在数据表上定义一个计算列,即电子邮件字段的 REVERSE 并对其进行索引。这会将上面的查询变成一个 LIKE 条件,最后使用通配符,如下所示:

SELECT d.id, d.email
FROM data d
    INNER JOIN errors e ON d.emailreversed LIKE REVERSE(e.error) + '%'

在这种情况下,性能会更好,因为它允许使用索引。

我在博客上写了一篇关于这种方法的完整文章 a while ago here .

关于sql-server - 从另一个表中选择具有子字符串的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4027926/

相关文章:

mysql - 用于删除此条件为真 : 的行的存储过程

sql-server - SQL 过程没有参数并且提供了参数

sql-server-2008 - GML 到 SQL 地理 - 24200 : The specified input does not represent a valid geography instance

sql-server-2008 - SQL Server FILESTREAM 存储

sql-server - 在 SQL Server 中,我们不能在 Insert 语句中包含哪些数据类型?

sql - 当用户的 SQL Server 密码过期时,从 VBA 执行 sp_password(存储过程)

mysql - 通过存储过程分配行号

SQL Server 2014 - 模拟和 CTE 循环

sql - 从 SQL 表中按 O(1) 选择

sql - 在这里使用 varbinary 比 varchar 有什么优势?