SQL Server聚合使用like

时间:2014-11-03 17:26:52

标签: sql sql-server regex

我有一个包含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
     ...             ...

最好的方法是什么?

2 个答案:

答案 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