查找其中一列包含另一文本的记录

时间:2019-02-25 16:58:57

标签: tsql sql-server-2016

我有一个表,其中包含县名和电子邮件地址的另一列。我想查找电子邮件地址中包含县名的所有记录。我已经尝试过LIKECHARINDEX,但仍无法达到预期的效果-甚至可以使用我在此站点上找到的其他示例。

样本数据:

UserID  email                            County
15854   test@test.com                    POLK
15018   test@adaircounty.org             ADAIR
15020   test@adaircounty.org             ADAIR
15022   test@adaircounty.org             ADAIR
15024   adamsrecorder@adamscountyia.com  ADAMS
15026   test@frontier.com                ADAMS
15028   test@co.allamakee.us             ALLAMAKEE
15030   lwelch@co.allamakee.ia.us        ALLAMAKEE
15032   test@co.allamakee.us             ALLAMAKEE
15034   test@appanoosecounty.net         APPANOOSE

我尝试过的不同版本包括:

SELECT UserID , email , County
FROM   #CountyRecorders
--WHERE email LIKE '%' + County + '%';
--WHERE County LIKE '%' + email + '%';
--WHERE CHARINDEX(email,County) > 0;
--WHERE CHARINDEX(County,email) > 0;

如何完成所需的结果集?谢谢,

3 个答案:

答案 0 :(得分:1)

您应该可以为此使用CHARINDEX 做

Select UserId, email, County
FROM #CountyRecorders
WHERE CHARINDEX(County,email) > 0

这里的外壳很重要

答案 1 :(得分:1)

您没有说明预期的结果,但是-如果我做对了-您的一种方法应该正确返回。这对我有用:

DECLARE @tbl TABLE(UserID INT,  email VARCHAR(100),County VARCHAR(100));
INSERT INTO @tbl VALUES
 (15854,'test@test.com                    ','POLK')
,(15018,'test@adaircounty.org             ','ADAIR')
,(15020,'test@adaircounty.org             ','ADAIR')
,(15022,'test@adaircounty.org             ','ADAIR')
,(15024,'adamsrecorder@adamscountyia.com  ','ADAMS')
,(15026,'test@frontier.com                ','ADAMS')
,(15028,'test@co.allamakee.us             ','ALLAMAKEE')
,(15030,'lwelch@co.allamakee.ia.us        ','ALLAMAKEE')
,(15032,'test@co.allamakee.us             ','ALLAMAKEE')
,(15034,'test@appanoosecounty.net         ','APPANOOSE');

SELECT *
FROM @tbl 
WHERE eMail LIKE '%' + County + '%';

返回所有行-除了“ test”和“ frontier.com”行。

可能会干扰的内容:如果您的列在区分大小写排序规则下,则大写的ADAIRadair不相同。您可以尝试在两侧都使用LOWER或对COLLATE应用不敏感的排序规则

答案 2 :(得分:1)

这两个答案都行得通-实际上,我已经在WHERE子句中使用CHARINDEX看到了这种类型的东西,但性能更高,但是已经接近了。出于性能原因,我要采用的方法是使用计算列并为其编制索引。这样,您只执行一次计算。使用@Shnugo的样本数据(已转换为烫发临时表进行测试):

-- Table DDL and sample data
CREATE TABLE #tbl 
(
  UserID INT,
  email  VARCHAR(100),
  County VARCHAR(100),
  CountyInEmail AS CAST(SIGN(CHARINDEX(County,email)) AS BIT) PERSISTED
);
INSERT INTO #tbl VALUES
 (15854,'test@test.com                    ','POLK')
,(15018,'test@adaircounty.org             ','ADAIR')
,(15020,'test@adaircounty.org             ','ADAIR')
,(15022,'test@adaircounty.org             ','ADAIR')
,(15024,'adamsrecorder@adamscountyia.com  ','ADAMS')
,(15026,'test@frontier.com                ','ADAMS')
,(15028,'test@co.allamakee.us             ','ALLAMAKEE')
,(15030,'lwelch@co.allamakee.ia.us        ','ALLAMAKEE')
,(15032,'test@co.allamakee.us             ','ALLAMAKEE')
,(15034,'test@appanoosecounty.net         ','APPANOOSE');

-- Index on the "CountyInEmail" field
CREATE NONCLUSTERED INDEX nc_County ON #tbl(CountyInEmail)
INCLUDE (UserID, email, County)
;

-- Note the execution plan here (nonclustered index seek = good)
SELECT t.UserID, t.email, t.County, t.CountyInEmail
FROM   #tbl AS t
WHERE  t.CountyInEmail = 1;