Найти записи, где один столбец содержит текст другого - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть таблица, которая содержит название округа и другой столбец для адреса электронной почты.Я хочу найти все записи, где название округа содержится в адресе электронной почты.Я пробовал LIKE и CHARINDEX, но пока не смог заставить это работать должным образом - даже используя другие примеры, которые я нашел здесь на этом сайте.

Пример данных:

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 голосов
/ 25 февраля 2019

Вы не указали ожидаемый результат, но - если я правильно понял - один из ваших подходов должен вернуться правильно.Это работает для меня:

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".

Что может помешать: если ваши столбцы находятся под с учетом регистра сопоставление с заглавной буквы ADAIR отличается от adair.Вы можете попробовать либо использовать LOWER с обеих сторон, либо применить нечувствительное сопоставление с COLLATE

0 голосов
/ 26 февраля 2019

Оба ответа здесь сработают - на самом деле я видел лучшую производительность, используя CHARINDEX в предложении WHERE для этого типа вещей, но он близок.По соображениям производительности я бы подошел к этому, используя вычисляемый столбец и индексируя его.Таким образом, вы можете выполнить расчет только один раз.Используя примерные данные @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;
0 голосов
/ 25 февраля 2019

Вы должны просто иметь возможность использовать CHARINDEX для этого.

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

ваш корпус имеет значение здесь, хотя

...