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存储过程中是不是有三元运算符?的主要内容,如果未能解决你的问题,请参考以下文章