如何从列数据中设置变量值?

时间:2016-11-12 13:45:46

标签: sql sql-server tsql

我想为此查询声明一个可重用性的变量:

SELECT 
    SUBSTRING(Email, CHARINDEX('@', Email) + 1, LEN(Email) - CHARINDEX('@', Email)), 
    COUNT(*) 
FROM 
    Student
GROUP BY 
    SUBSTRING(Email, CHARINDEX('@', Email) + 1, LEN(Email) - CHARINDEX('@', Email))

该变量包含SUBSTRING(Email,CHARINDEX('@', Email)+1,LEN(Email)-CHARINDEX('@', Email))

但似乎在SELECT语句之外无法访问列数据:

DECLARE @exp NVARCHAR(20) =    
   SUBSTRING(Email,CHARINDEX('@', Email)+1,LEN(Email)-CHARINDEX('@', Email))

1 个答案:

答案 0 :(得分:2)

这样做的一种方法是使用视图;另一个使用CTE。我碰巧使用OUTER APPLY,因为它可以很容易地添加许多相互引用的变量:

SELECT domain, COUNT(*)
FROM Student s OUTER APPLY
     (VALUES ( SUBSTRING(s.Email, CHARINDEX('@', s.Email) + 1, LEN(s.Email) - CHARINDEX('@', s.Email)) )
     ) v(domain)
GROUP BY domain;

或者,你可以写:

SELECT domain, COUNT(*)
FROM Student s OUTER APPLY
     (VALUES ( CHARINDEX('@', s.Email) )
     ) as pos(pos)
     (VALUES ( SUBSTRING(s.Email, pos.po + 1, LEN(s.Email) - pos.pos) )
     ) v(domain)
GROUP BY domain;

最后,您可能会发现此表达式更容易:

SELECT domain, COUNT(*)
FROM Student s OUTER APPLY
     (VALUES ( STUFF(s.Email, 1, CHARINDEX('@', s.Email), '') )
     ) v(domain)
GROUP BY domain;

通过这种简化,您甚至可能根本不需要额外的变量。