我想为此查询声明一个可重用性的变量:
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))
答案 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;
通过这种简化,您甚至可能根本不需要额外的变量。