Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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
MySQL在MSSQL中相当于分配一个变量并使用它_Mysql_Sql_Sql Server - Fatal编程技术网

MySQL在MSSQL中相当于分配一个变量并使用它

MySQL在MSSQL中相当于分配一个变量并使用它,mysql,sql,sql-server,Mysql,Sql,Sql Server,我试着找到答案,但也许我对MSSQL太陌生了,我来自MySQL,所以我的问题非常简单,直截了当: 想象一下我们有一张桌子 Thingie | Value --------+------- Thing1 | 10 Thing1 | 15 Thing1 | 16 谢谢大家抽出时间。我将拆除我的查询,并在考虑您所有输入的情况下重新执行它。格雷西亚斯,总计。不,这在SQL中不起作用。在查询完成之前,不会设置参数值。您可以通过两个步骤完成此操作: DECLARE @halfvalue F

我试着找到答案,但也许我对MSSQL太陌生了,我来自MySQL,所以我的问题非常简单,直截了当: 想象一下我们有一张桌子

Thingie | Value --------+------- Thing1 | 10 Thing1 | 15 Thing1 | 16
谢谢大家抽出时间。我将拆除我的查询,并在考虑您所有输入的情况下重新执行它。格雷西亚斯,总计。

不,这在SQL中不起作用。在查询完成之前,不会设置参数值。您可以通过两个步骤完成此操作:

DECLARE @halfvalue FLOAT = 0;

SELECT @halfvalue = ([Value] / 2)
FROM Things ;

SELECT Thingie
    , [Value]
    , HalfValue = [Value]/2
    , HalfAgainValue = @halfvalue / 2
FROM Things ;

答案很简单:在MSSQL中无法做到这一点,因为当您尝试它时,您将得到:

味精141,第15级,状态1,第3行 为变量赋值的SELECT语句不得与数据检索操作结合使用

你很可能经历过

最简单的解决办法是:

SELECT Thingie, Value, Value/2, Value/4 from Things
其他方法:

select Thingie, Value, HalfValue, HalfValue / 2 from (
    SELECT Thingie, Value, Value / 2 HalfValue from Things
) a
您认为在MySQL中可以做到这一点:

SET @halfvalue := 0;
SELECT Thingie, Value,
       (@halfvalue := Value / 2) AS HalfValue,
       (@halfvalue / 2) AS HalfOfHalf
FROM Things;
但是你错了。为什么?MySQL和其他数据库一样,不能保证SELECT中表达式的求值顺序。政府甚至警告说:

在下面的语句中,您可能认为MySQL将首先计算@a,然后再进行赋值:

SELECT @a, @a:=@a+1, ...;
但是,涉及用户变量的表达式的求值顺序尚未定义

在这两个数据库中,都可以使用子查询。在最新版本的MySQL和几乎任何其他数据库中,您也可以使用CTE:

SELECT Thingie, Value, HalfValue,
       (HalfValue / 2) AS HalfOfHalf
FROM (SELECT t.*, (Value / 2) AS HalfValue
      FROM Things t
     ) t;

也许试着描述一下你真正想做什么。您当前的示例可以轻松改写为。。。值/2作为半值,值/4作为半值的一半。。。但我想这对你没有帮助,关于实际问题。@JuanLescano。你对MySQL的看法是错误的。请参阅我的答案和文档参考。代码有时能工作并不意味着它是正确的并且保证能工作。是的,我会发布实际的select,这样你就可以看到它有点复杂,但我认为子查询将是一种方式。我肯定犯了很多错误,我会继续遵循这条线索,以防有人教我一两件事:据我所知,在SQL Server中,我们无法将变量与数据检索操作相结合。变量必须单独分配,或与其他变量一起设置或选择,然后才能在数据检索操作中使用。我的错误,从第一次查询中删除了检索。我不知道您刚才给我的警告,有趣的信息,将在以后的查询中记在心里。曾经想过子查询,不想使用它,似乎是正确的方法,我仍然需要学习。编辑:输入保存注释。。。
SET @halfvalue := 0;
SELECT Thingie, Value,
       (@halfvalue := Value / 2) AS HalfValue,
       (@halfvalue / 2) AS HalfOfHalf
FROM Things;
SELECT @a, @a:=@a+1, ...;
SELECT Thingie, Value, HalfValue,
       (HalfValue / 2) AS HalfOfHalf
FROM (SELECT t.*, (Value / 2) AS HalfValue
      FROM Things t
     ) t;