MySQL查询中的非空问题

MySQL查询是我们经常会用到的操作,下面将为您分析MySQL查询中的非空问题,希望对您学习MySQL查询方面能够有些许的帮助。

表的订单状态字段设计为varchar类型,有以下值:NULL,pending,pending refund,refund,cancel.我们知道查询状态为cancel的订单,SQL语句可以这样写:

  1. SELECT o.oid,o.moneyreceipt,o.moneyget,o.thecurrency,o.status FROM qorder o WHERE o.status = 'cancel' 

SQL语句能查询出正确的数据,但是当我们想查询状态为非cancel的订单时,可能会出麻烦, 因为status字段没有设置NOT NULL,所以大部分订单的status值都是NULL,这样的话,用'<>’查询出来的数据不正确,只有status除了cancel之外 的非空数据查询出来了,而为NULL的没有查询出来。SELECT o.oid,o.moneyreceipt,o.moneyget,o.thecurrency,o.status FROM qorder o WHERE o.status <> ‘cancel’原 因:NULL值操作
NULL值可能令人感 到奇怪直到你习惯它。概念上,NULL意味着“没有值”或“未知值”,且它被看作与众不同的值。为了测试NULL,你不能使用算术比较 操作符例如=、<或!=。为了说明它,试试下列查询:

  1. mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;  
  2. +----------+-----------+----------+----------+  
  3. 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |  
  4. +----------+-----------+----------+----------+  
  5. |     NULL |      NULL |     NULL |     NULL |  
  6. +----------+-----------+----------+----------+  

很 显然你不能通过这些比较得到有意义的结果。相反使用IS NULL和IS NOT NULL操作符:

  1. mysql> SELECT 1 IS NULL, 1 IS NOT NULL;  
  2. +-----------+---------------+  
  3. | 1 IS NULL | 1 IS NOT NULL |  
  4. +-----------+---------------+  
  5. |         0 |             1 |  
  6. +-----------+---------------+  

请注意在MySQL中,0或 NULL意味着假而其它值意味着真。布尔运算的默认真值是1。根据以上的NULL值操作结果,最终使用此种方式解决:SELECT o.oid,o.moneyreceipt,o.moneyget,o.thecurrency,o.status FROM qorder o WHERE IFNULL(o.status,’pending’) <> ‘cancel’学习:IFNULL(expr1,expr2)
如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值,取决于它被使 用的上下文环境。

  1. mysql> select IFNULL(1,0);  ->1  
  2. mysql> select IFNULL(0,10);  ->0  
  3. mysql> select IFNULL(1/0,10);  ->10.0000  
  4. mysql> select IFNULL(1/0,'yes');          
  5.  
  6. ->'yes'IF(expr1,expr2,expr3)  
  7.  

如果expr1是TRUE(expr1<>0且expr1<>NULL),那么IF()返回 expr2,否则它返回expr3。IF()返回一个数字或字符串值,取决于它被使用的上下文。

  1. mysql> select IF(1>2,2,3);  -> 3  
  2. mysql> select IF(1<2,'yes','no'); -> 'yes'  
  3. mysql> select IF(strcmp('test','test1'),'yes','no'); -> 'no'  

expr1作为整数值被计算,它意味着如 果你正在测试浮点或字符串值,你应该使用一个比较操作来做。

  1. mysql> select IF(0.1,1,0);  -> 0  
  2. mysql> select IF(0.1<>0,1,0);  -> 1  

在上面的第一种情况中,IF(0.1)返回0,因为0.1被变换 到整数值, 导致测试IF(0)。这可能不是你期望的。在第二种情况中,比较测试原来的浮点值看它是否是非零,比较的结果被用作一个整数。

  1. CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END   
  2.  
  3. CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END   
  4.  

第一个版本返回 result,其中value=compare-value。第二个版本中如果第一个条件为真,返回result。如果没有匹配的result值,那么结 果在ELSE后的result被返回。如果没有ELSE部分,那么NULL被返回。

  1. mysql> SELECT CASE 1 WHEN 1 THEN "one" WHEN 2 THEN "two" ELSE "more" END; -> "one"  
  2. mysql> SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END;  -> "true"  
  3. mysql> SELECT CASE BINARY "B" when "a" then 1 when "b" then 2 END; -> NULL   

 

 

 

【编辑推荐】

MySQL查询超时问题的解决

MySQL无重复查询的实现

详解mysql命令行给列起假名

MySQL查询优化器的工作原理

MySQL日期函数和时间函数

 

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/262080.html<

(0)
运维的头像运维
上一篇2025-05-03 22:36
下一篇 2025-05-03 22:38

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注