Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从列数据设置变量值?_Sql_Sql Server_Tsql - Fatal编程技术网

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