石鑫华视觉论坛

 找回密码
 注册会员
查看: 1964|回复: 0

[原创] LabVIEW SQL条件查询时条件值等于空时无返回数据

[复制链接]
  • TA的每日心情
    慵懒
    昨天 10:09
  • 签到天数: 3411 天

    连续签到: 13 天

    [LV.Master]2000FPS

    发表于 2020-2-27 12:33:05 | 显示全部楼层 |阅读模式 来自:广东省东莞市 联通

    注册登陆后可查看附件和大图,以及购买相关内容

    您需要 登录 才可以下载或查看,没有账号?注册会员

    x
    LabVIEW SQL条件查询时条件值等于空时无返回数据
    今天使用LabVIEW做数据库时,在一个条件查询中,条件为空(或非空),例如是一个字段,真时是T,假时为空,那么要按条件查找所有空的数据,T的不查找。那么按照一般的逻辑就是Select * from 表名 where 字段='';这样的语句。可是在查询中,没有返回相关的数据。

    条件等于空时无返回数据

    条件等于空时无返回数据

    当条件=''空时,无返回数据

    条件等于F时

    条件等于F时

    条件='F'时有值返回

    条件等于T时

    条件等于T时

    条件='T'时也有值返回

    后来上网查找相关知识点,发现在SQL中逻辑表达式的可能值包括TRUE、FALSE和UNKNOWN,它们被称之为三值逻辑。而在其它的语言中,逻辑表达式只有两种,要么是true,要么就是false。而sql中却存在第三个逻辑表达式UnKnown,这个是sql中特有的。从字面意思上我们可以解理该值的意思是:什么都不知道,就是什么都不是。一般情况下我们将任何值(包括NULL本身)与NULL做比较的时候,都会返回UnKnown。而在查询表达式中(比如where与having中),UnKnown会视为false。所以我们就明白了为什么select * from 表 where 字段=''查不到正确的结果的原因了。也就是在这里,如果是='',那么也就意味着,有两种情况出现,一种是null,另一种是unknown,所以这里是不能这样直接用条件=''的方式来做条件的。

    解决方法:
    一、对条件字段,每个都写T或F来做逻辑判断,这样就可以用条件='T'或条件='F'来做判断条件。
    二、使用select * from 表名 where 字段 is null;的语句来查询,这里的意思就是直接判断字段是null值。或者是where 字段 is not null;的方式来查找非空字段。有些人说可以直接使用字段=null的方式来判断,但是我这里使用Access的mdb数据库,无法实现这种条件判断方式,只能使用is null或is not null的方式来判断:

    is null

    is null

    is null方式可行

    is not null

    is not null

    is not null方式可行

    字段='null'

    字段='null'

    字段='null'方式不行

    字段=null

    字段=null

    字段=null方式不行

    PS:
    遇到一个尴尬的事。用LabVIEW写入空字符串后,又可以用字段=''的方式查找,用字段 is null的方式却查不到。只能说明,ACESS时的默认的空和LabVIEW写入的空,不是一回事,难道这个空还有编码问题????

    上面三格是ACCESS默认的空白下面三格是LabVIEW写入的空白

    上面三格是ACCESS默认的空白下面三格是LabVIEW写入的空白

    上面三格是ACCESS默认的空白下面三格是LabVIEW写入的空白
    在MDB数据库中,图中显示上面的三格,是在原有的数据库上添加新的字段后默认的值(即空白,这个是ACCESS的默认空白),这些得使用删除 is null的方式才能查找到,而下面的三格,是用LabVIEW写入的数据库,删除字段使用LabVIEW的字符串并什么也没填(LabVIEW的空白),这时使用删除 is null查找不到,但是用删除=''可以查找到:

    删除=''仅三行数据即LabVIEW写入的数据

    删除=''仅三行数据即LabVIEW写入的数据

    删除=''仅三行数据即LabVIEW写入的数据

    删除 is null有两千多行,是Access默认的空白

    删除 is null有两千多行,是Access默认的空白

    删除 is null有两千多行,是Access默认的数据

    所以这里面还有些问题存在,如果是后期增加的字段,又没有对历史数据进行重新赋值,那么就需要使用一下or,类似于where 删除 is null or 删除='';这样的条件限制,才可以查找到所有的空白。如果是对字段用LabVIEW重新写入一次空白或其它字符,则可以用LabVIEW中的字段=''方式。但是labview写入数据后,应该是不能写入默认的access的空白的,所以对于access默认的空白,一定是要做一下处理才可以的。对于新的数据库,还没数据时,一条条写入,因为就一直是LabVIEW的空白,也就不会存在这样的问题。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册会员

    本版积分规则

    LabVIEW HALCON图像处理入门教程(24.09)
    石鑫华机器视觉与LabVIEW Vision图像处理PDF+视频教程11种全套
    《LabVIEW Vision函数实例详解2020-2024》教程-NI Vision所有函数使用方法介绍,基于NI VISION2020,兼容VDM21/22/23/24

    QQ|石鑫华视觉论坛 |网站地图

    GMT+8, 2024-12-22 15:48

    Powered by Discuz! X3.4

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表