MySQL存储过程中是不是有三元运算符?

Posted

技术标签:

【中文标题】MySQL存储过程中是不是有三元运算符?【英文标题】:Is there a ternary operator in MySQL stored procedures?MySQL存储过程中是否有三元运算符? 【发布时间】:2013-12-19 14:40:55 【问题描述】:

SQL (mysql) 是否支持三元运算符?

我有这个 SQL:

CREATE TEMPORARY TABLE SalesTbl (
    CTR int primary key auto_increment, 
    VRNOA VARCHAR(50), 
    DESCRIPTION VARCHAR(50), 
    INQTY INT, 
    OUTQTY INT, 
    ETYPE VARCHAR(50), 
    RTotal DECIMAL(19,2)
);

INSERT INTO SalesTbl
SELECT 0, stockmain.VRNOA AS 'VRNOA', Item.description as 'DESCRIPTION', 
       qty as 'QTY', Stockmain.etype 'ETYPE', null 
FROM StockMain 
     INNER JOIN StockDetail on StockMain.stid = StockDetail.stid 
     INNER JOIN ITEM on StockDetail.item_id = Item.item_id 
WHERE StockDetail.item_id = 6 
AND   StockMain.vrdate BETWEEN '2010/10/02' AND '2013/12/02' 
ORDER BY Qty;

在 MySQL 中可以做这样的事情吗?

(QTY < 0) ? QTY : 0

如果 QTY 小于 0,则使用 QTY,否则使用 0。

【问题讨论】:

【参考方案1】:

MySQL 中没有专门的三元运算符,但您可以像这样得到接近它的东西:

delimiter //
DROP PROCEDURE IF EXISTS `foobar`//
CREATE PROCEDURE `foobar`()
BEGIN
  declare romulan int default 0;
  set romulan = 1;

  select if (romulan = 1, 52, 99) into romulan;

  select romulan;
END//

像这样运行它:

mysql> call foobar(3);

打印出来:

+---------+
| romulan |
+---------+
|      52 |
+---------+
1 row in set (0.00 sec)

所以如果 romulan 为 1,则 romulan 变为 52,否则 romulan 变为 99。

【讨论】:

【参考方案2】:

您需要 CASE 语句(或者有 IF 语句,但 CASE 是许多数据库的标准),它返回第一个真实条件的表达式。http://dev.mysql.com/doc/refman/5.0/en/case.html

CREATE TEMPORARY TABLE SalesTbl (CTR int primary key auto_increment, 
                                 VRNOA VARCHAR(50), 
                                 DESCRIPTION VARCHAR(50), 
                                 INQTY INT, 
                                 OUTQTY INT, 
                                 ETYPE VARCHAR(50), 
                                 RTotal DECIMAL(19,2));

INSERT INTO SalesTbl

SELECT 
  0, 
  stockmain.VRNOA AS 'VRNOA', 
  Item.description as 'DESCRIPTION', 
  qty as 'QTY', 
  CASE WHEN qty<0 then qty end as InQTY, 
  CASE WHEN qty>0 then qty end as OutQTY,
  Stockmain.etype 'ETYPE', 
  null 
 FROM StockMain 
INNER JOIN StockDetail on StockMain.stid = StockDetail.stid 
INNER JOIN ITEM on StockDetail.item_id = Item.item_id 
WHERE StockDetail.item_id = 6 
AND StockMain.vrdate BETWEEN '2010/10/02' AND '2013/12/02' 
ORDER BY Qty;

【讨论】:

感谢您的回答。请检查问题。我已经更新了。 此行将不再起作用,因为您的临时表 SalesTbl 中不再有 QTY 列:SET RTotal = (@RunningTotal := @RunningTotal + QTY); 您需要修改 INQTY 和 OUTQTY 工作就像一个魅力。谢谢:-)

以上是关于MySQL存储过程中是不是有三元运算符?的主要内容,如果未能解决你的问题,请参考以下文章

PromQL 是不是有三元运算符或如何按条件查询?

R中是不是存在三元运算符?

这些在 React 中使用三元运算符有条件地应用内联样式的方法在性能上是不是有任何差异?

三元运算符是不是以定义的方式短路

mysql三元运算,上下连表

将递增/递减运算符放在三元/条件运算符中是不是安全?