Sql 如何从列数据设置变量值?
我想为该查询声明一个可重用的变量:Sql 如何从列数据设置变量值?,sql,sql-server,tsql,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)) 变量包含子字符串(Em
SELECT
SUBSTRING(Email, CHARINDEX('@', Email) + 1, LEN(Email) - CHARINDEX('@', Email)),
COUNT(*)
FROM
Student
GROUP BY
SUBSTRING(Email, CHARINDEX('@', Email) + 1, LEN(Email) - CHARINDEX('@', Email))
变量包含子字符串(Email,CHARINDEX('@',Email)+1,LEN(Email)-CHARINDEX('@',Email))
但在SELECT
语句之外似乎无法访问列数据:
DECLARE @exp NVARCHAR(20) =
SUBSTRING(Email,CHARINDEX('@', Email)+1,LEN(Email)-CHARINDEX('@', Email))
一种方法是使用视图;另一个使用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;
通过这种简化,您可能根本不需要额外的变量。什么是
v
,为什么它是任意字符?@MohamedAhmed在FROM
子句中使用的派生表需要别名。它也可以被命名为Zelmo
。