2015-06-28 35 views
0

我正在使用MySQL。让我们称之为一个表,我为Inventory,看起来是下面:在SET语句中使用MIN()MySQL

+----+--------+--------+-------------+----------+ | ID | Price1 | Price2 | TargetPrice | Quantity | +----+--------+--------+-------------+----------+ | 1 | 12 | 1 | | 0 | | 2 | 3 | 3 | 3 | 2 | | 3 | | 4 | | 0 | | 4 | 2 | 2 | 2 | 2 | | 5 | 5 | 45 | 5 | 1 | +----+--------+--------+-------------+----------+

现在,我需要更新TargetPrice到价格1和Price2的最小值,其数量为0

我有任何行尝试:

UPDATE Inventory SET TargetPrice= MIN(Price1,Price2) WHERE Quantity >0

然而,MySQL的抱怨MIN()函数的用法。我知道它期望MIN()处理列中包含的数据,而不是取指定行的两列的MIN()。

无论如何要实现这个比游标?

编辑: Price1Price2可以null0并且在所有这些情况下,应为无穷大,这样其他的价格获取在反对它相比是最小的治疗。

回答

2

使用LEAST代替MIN

UPDATE Inventory 
SET TargetPrice = LEAST(Price1,Price2) 
WHERE Quantity = 0 

MIN是一个聚合函数上的行集操作,而LEAST传递的参数列表上运行。

编辑:

UPDATE Inventory 
SET TargetPrice = LEAST(COALESCE(Price1, Price2), COALESCE(Price2, Price1)) 
WHERE Quantity = 0 

您可以使用COALESCE处理NULL值。

EDIT2:

您可以使用NULLIF处理0值:

UPDATE Inventory 
SET TargetPrice = LEAST(COALESCE(NULLIF(Price1,0), Price2), 
         COALESCE(NULLIF(Price2,0), Price1)) 
WHERE Quantity = 0 
+0

谢谢。但是,对于ID = 3,价格1为空,因此上面的LEAST()返回NULL。我想在这种情况下返回价格2。所以基本上,如果两个价格中的任何一个为0或零,我需要返回另一个价格,并且对于所有其他条件,数学最小。有什么帮助吗? – Kallol

+0

Thx再次。我没有使用'COALESCE'的原因是它只处理NULL。我需要处理0也作为类似的行为NULL。尽管我原来的问题中没有示例数据,但我现在已经更改了它以包含此要求。可能'CASE'可以提供帮助吗?但是如果两者都是NULL(我们需要报告一个NULL)? – Kallol

+0

@卡洛尔再次编辑。 –