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

问题描述 投票:0回答:3

我有一个包含县名的表和另一个用于电子邮件地址的列。我想查找电子邮件地址中包含县名的所有记录。我已经尝试了LIKECHARINDEX,但我还没能按预期工作 - 甚至使用我在这个网站上找到的其他例子。

样本数据:

UserID  email                            County
15854   [email protected]                    POLK
15018   [email protected]             ADAIR
15020   [email protected]             ADAIR
15022   [email protected]             ADAIR
15024   [email protected]  ADAMS
15026   [email protected]                ADAMS
15028   [email protected]             ALLAMAKEE
15030   [email protected]        ALLAMAKEE
15032   [email protected]             ALLAMAKEE
15034   [email protected]         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;

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

tsql sql-server-2016
3个回答
1
投票

这里的两个答案都可行 - 我实际上在WHERE子句中使用CHARINDEX看到了更好的性能,但这种情况很接近。出于性能原因,我将采用的方法是使用计算列并对其进行索引。这样您只需执行一次计算。使用@Shnugo的示例数据(转换为perm临时表进行测试):

-- 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,'[email protected]                    ','POLK')
,(15018,'[email protected]             ','ADAIR')
,(15020,'[email protected]             ','ADAIR')
,(15022,'[email protected]             ','ADAIR')
,(15024,'[email protected]  ','ADAMS')
,(15026,'[email protected]                ','ADAMS')
,(15028,'[email protected]             ','ALLAMAKEE')
,(15030,'[email protected]        ','ALLAMAKEE')
,(15032,'[email protected]             ','ALLAMAKEE')
,(15034,'[email protected]         ','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;

1
投票

您应该只能使用CHARINDEX进行此操作

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

你的外壳虽然很重要


1
投票

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

DECLARE @tbl TABLE(UserID INT,  email VARCHAR(100),County VARCHAR(100));
INSERT INTO @tbl VALUES
 (15854,'[email protected]                    ','POLK')
,(15018,'[email protected]             ','ADAIR')
,(15020,'[email protected]             ','ADAIR')
,(15022,'[email protected]             ','ADAIR')
,(15024,'[email protected]  ','ADAMS')
,(15026,'[email protected]                ','ADAMS')
,(15028,'[email protected]             ','ALLAMAKEE')
,(15030,'[email protected]        ','ALLAMAKEE')
,(15032,'[email protected]             ','ALLAMAKEE')
,(15034,'[email protected]         ','APPANOOSE');

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.