我有一个包含2列的表,一个是1/0标志,表示他们是否已打开电子邮件,第二个是电子邮件地址(即joe123@domain.com)。
Opened Email
0 joe123@domain.com
1 sue234@email.net
... ...
我试图通过在LIKE中使用正则表达式模式来查找用户名中的某些模式是否会影响开放率,但我不确定匹配的行的语法与该模式不匹配。
例如,我可以这样做:
SELECT Email, sum(Opened)
FROM table1
WHERE Email LIKE '%joe%'
但这只给了我匹配的行。我想要在同一输出中执行和不匹配的行。
我想得到这样的东西:
Pattern Opened
'joe' 55
not_joe 15987
'sue' 78
not_sue 15964
... ...
最好的方法是什么?
答案 0 :(得分:1)
如果我理解正确,您正在尝试识别类似的用户名
您可以使用SOUNDEX之类的功能按照
分组SELECT
Email,
SOUNDEX(Email)
FROM TableA
SELECT COUNT(*) OpenedCount,
SOUNDEX(Email) EmailSOUNDEX
FROM TableA
GROUP BY SOUNDEX(Email)
ORDER BY OpenedCount desc
如果你想要的只是所有有起诉权的电子邮件吗?
SELECT COUNT(*) OpenedCount,
SOUNDEX(Email) EmailSOUNDEX
FROM TableA
WHERE
Email like '%Sue%'
GROUP BY SOUNDEX(Email)
ORDER BY OpenedCount desc
对于这种搜索,您可以使用相关搜索词构建字典并与
连接SELECT COUNT(*) OpenedCount,
SearchTermTable.Term
FROM TableA
JOIN SearchTermTable ON
TableA.Email like '%'+SearchTermTable.Term+'%'
WHERE
GROUP BY SearchTermTable.Term
ORDER BY OpenedCount desc
答案 1 :(得分:1)
如果你已经有一个模式列表,你可以通过使用CROSS JOIN来实现LIKE / NOT LIKE(警告:性能命中)。
请参阅下面的示例。注意:您可以在SELECT语句中提高LIKE的性能 - 有other options available。
DECLARE @MatchList TABLE (ID INT, Pattern VARCHAR(3))
INSERT INTO @MatchList (ID, Pattern) VALUES (1, 'Joe')
INSERT INTO @MatchList (ID, Pattern) VALUES (2, 'Sue')
DECLARE @Table1 TABLE (Email VARCHAR(100))
INSERT INTO @Table1 (Email) VALUES ('joe123@domain.com')
INSERT INTO @Table1 (Email) VALUES ('sue234@email.net')
INSERT INTO @Table1 (Email) VALUES ('sue682@email.net')
INSERT INTO @Table1 (Email) VALUES ('a@domain.com')
INSERT INTO @Table1 (Email) VALUES ('b@domain.com')
INSERT INTO @Table1 (Email) VALUES ('c@domain.com')
INSERT INTO @Table1 (Email) VALUES ('d@domain.com')
INSERT INTO @Table1 (Email) VALUES ('e@domain.com')
SELECT
CASE WHEN Email LIKE '%'+Pattern+'%' THEN Pattern ELSE 'not_'+Pattern END AS Classification,
COUNT(*) Opened
FROM
@MatchList m
CROSS JOIN
@Table1
GROUP BY m.ID, CASE WHEN Email LIKE '%'+Pattern+'%' THEN Pattern ELSE 'not_'+Pattern END
ORDER BY m.ID