在SQL中使用NULL和空列值进行乘法运算

时间:2012-03-28 00:56:35

标签: sql database

这是我的面试问题

在Area表中有两列名为Length和Breadth

Length  Breadth  Length*Breadth
20      NULL        ?

30                   ?

21.2     1           ?

我尝试在插入时在MYSQL上运行相同的问题,为了插入一个空值,我尝试了下面的查询。我在MYSQL中插入空值时是否遗漏了任何内容。

插入test.new_table值(30,);

答案:使用Null,结果为空。          使用float和int乘法结果是float

5 个答案:

答案 0 :(得分:3)

根据您的问题,预期结果如下。

SELECT LENGTH,BREADTH,LENGTH*BREADTH AS CALC_AREA FROM AREA;


LENGTH  BREADTH   CALC_AREA 
20      
30      0         0
21.2    1         21.2

对于SQL SERVER中的任何(第一个)记录,如果使用NULL进行计算,答案将为NULL。

对于SQL SERVER中的任何(第二个)记录,如果在非空值和空值之间进行乘积计算,则结果将为零,因为空值被视为零。

对于SQL SERVER中的任何(第三个)记录,如果在两个非空数据类型值之间进行计算,则答案将是NON-EMPTY值。

检查SQL小提琴以供参考 - http://sqlfiddle.com/#!3/f250a/1

答案 1 :(得分:0)

除非呼吸是VARCHAR,否则不能发生空白呼吸(第二排)。假设,答案将是:

  1. NULL(因为NULL时间为NULL)

  2. 引发错误(因为空字符串不是数字。在Sql Server中,错误是“将数据类型varchar转换为数字时出错。”)

  3. 21.20(例如,在Sql Server中,转换为数字类型是自动的,因此SELECT 21.2 * '1'返回21.20)。

答案 2 :(得分:0)

任何值和NULL的乘积都是NULL。如果你想谷歌它,这称为“空传播”。要在面试中获得积分,您可能要提到NULL不是值;这是一个特殊的标记。

事实上,广度列有一个条目“NULL”,一个条目是空白的(在第二行)是误导性的。在特定行中没有值的数字列表示该行为NULL。所以第二列也应该显示“NULL”。

第三行的答案21.2 * 1取决于“Length * Breadth”列的数据类型。如果它是一个数据类型,如float,double或numberic(16,2),答案是21.2。如果它是整数列(整数,长整数等),答案是21。

更讽刺的答案可能是“没有答案。字符串”Length * Breadth“不是合法的SQL列名。”

答案 3 :(得分:0)

假设Length和Breadth是某种类型的数字类型,则第二条记录不包含可能的值 - Breadth必须为0或NULL。

在任何情况下,SQL中涉及NULL值的任何数学运算都将返回值NULL,表示无法计算表达式。答案是NULL,不可能,21.2。

答案 4 :(得分:0)

在标准SQL中,它们都会产生错误,因为您正在比较不同类型的值(或空值):

CAST ( 20 AS FLOAT ) * CAST ( NULL AS INTEGER )  -- mismatched types error

CAST ( '' AS INTEGER )  -- type conversion error
CAST (  AS INTEGER )  -- type conversion error


CAST ( 21.2 AS FLOAT ) * CAST ( 2 AS INTEGER )  -- mismatched types error

另一方面,大多数SQL产品在根据类型优先级比较不同类型的值(或空值)时会隐式地转换值。将float值与整数值进行比较实际上会将整数转换为float并导致float。在产品层面,最有趣的问题是当你将integer类型的null与float类型的值(甚至是null)进行比较时会发生什么...

......但是,坦率地说,并不是非常有趣。在一次采访中,您将看到一个框架(以您提出的问题的形式),向您展示您的知识,技能和经验。这里的'答案'是讨论空值(例如,指出空值很难以不直观的方式定义和表现,导致频繁的错误和完全避免空值的愿望等)以及隐式转换是否是一件好事。 / p>