MySql中的IFNULL、NULLIF和ISNULL用法详解

MySql中的IFNULL、NULLIF和ISNULL用法详解,第1张

今天用到了MySql里的isnull才发现他和MSSQL里的还是有点区别,现在简单总结一下:

mysql中isnull,ifnull,nullif的用法如下:

isnull(expr)

的用法:

如expr

为null,那么isnull()

的返回值为

1,否则返回值为

0。

mysql>

select

isnull(1+1)

->

0

mysql>

select

isnull(1/0)

->

1

使用=

的null

值对比通常是错误的。

isnull()

函数同

is

null比较 *** 作符具有一些相同的特性。请参见有关is

null

的说明。

IFNULL(expr1,expr2)的用法:

假如expr1

不为

NULL,则

IFNULL()

的返回值为

expr1

否则其返回值为

expr2。IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境。

mysql>

SELECT

IFNULL(1,0)

->

1

mysql>

SELECT

IFNULL(NULL,10)

->

10

mysql>

SELECT

IFNULL(1/0,10)

->

10

mysql>

SELECT

IFNULL(1/0,'yes')

->

'yes'

IFNULL(expr1,expr2)的默认结果值为两个表达式中更加“通用”的一个,顺序为STRING、

REAL或

INTEGER。假设一个基于表达式的表的情况,

或MySQL必须在内存储器中储存一个临时表中IFNULL()的返回值:

CREATE

TABLE

tmp

SELECT

IFNULL(1,'test')

AS

test;

在这个例子中,测试列的类型为

CHAR(4)。

NULLIF(expr1,expr2)

的用法:

如果expr1

=

expr2

成立,那么返回值为NULL,否则返回值为

expr1。这和CASE

WHEN

expr1

=

expr2

THEN

NULL

ELSE

expr1

END相同。

mysql>

SELECT

NULLIF(1,1)

->

NULL

mysql>

SELECT

NULLIF(1,2)

->

1

如果参数不相等,则

MySQL

两次求得的值为

expr1

以上所述是小编给大家介绍的MySql中的IFNULL、NULLIF和ISNULL用法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

delete from xxx

修改为   delete from   被触发的表

由于 MySQL 没有直接抛出异常的语句

因此这里通过在触发器里面,插入/删除自己这个表

导致 MySQL 发生异常

下面是一个例子代码:

触发器实现数据完整性的处理1

-- 货物表

CREATE TABLE Goods(

  id  INT,

  Amount INT

)

-- 订单表

CREATE TABLE OrderDetail(

  ID   INT,

  GoodsID  INT,

  Amount   INT

)

-- 库存测试数据:

INSERT INTO Goods VALUES (1, 100)

要求:当订单表插入数据的时候,自动去货物表检查,是否有足够的库存

如果有,那么更新 货物表 的 库存 = 原库存 – 本次订单数量

如果库存不足,抱错返回. DELIMITER //

CREATE TRIGGER BeforeInsertOrderDetail

  BEFORE INSERT ON OrderDetail

FOR EACH ROW

BEGIN

  DECLARE

    v_nowCount INT

  SELECT

    Amount INTO v_nowCount

  FROM

    Goods

  WHERE

    ID = new.GoodsID

  IF v_nowCount - new.Amount < 0 THEN

    -- 由于 MySQL 没有直接抛出异常的语句

    -- 因此这里通过在触发器里面,插入/删除自己这个表

    -- 导致 MySQL 发生异常

    DELETE FROM

      OrderDetail

    WHERE

      ID = new.GoodsID

  ELSE

    UPDATE

      Goods

    SET

      Amount = Amount - new.Amount

    WHERE

      ID = new.GoodsID

  END IF

END

//

DELIMITER 

处理前

mysql> select * from goods

+------+--------+

| id   | Amount |

+------+--------+

|    1 |    100 |

+------+--------+

1 row in set (0.00 sec)

mysql> select * from OrderDetail

Empty set (0.00 sec)

mysql>  INSERT INTO OrderDetail VALUES(1, 1, 90)

Query OK, 1 row affected (0.02 sec)

mysql> INSERT INTO OrderDetail VALUES(1, 1, 20)

ERROR 1442 (HY000): Can't update table 'orderdetail' in stored function/trigger

because it is already used by statement which invoked this stored function/trigg

er.

处理后

mysql>  select * from goods

+------+--------+

| id   | Amount |

+------+--------+

|    1 |     10 |

+------+--------+

1 row in set (0.00 sec)

mysql> select * from OrderDetail

+------+---------+--------+

| ID   | GoodsID | Amount |

+------+---------+--------+

|    1 |       1 |     90 |

+------+---------+--------+

1 row in set (0.00 sec)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8649379.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存