DB2-处理定义为null的列

DB2-处理定义为null的列,db2,Db2,假设您有三个文本框,可以用来搜索数据。每个文本框将对应于DB2表上的一列。您输入的搜索字符串将插入where子句。例如,您有名字、姓氏和电话号码。如果不在特定的文本框中输入数据,我会在where子句中将其默认值设置为“_”,通配符用于选择所有内容。另外,假设电话号码在表中定义为空 如果用户输入了要搜索的电话号码,则将使用Cursor1。所以where子句看起来像这样: 名字在哪里,比如:名字和 姓氏如:lastname和 电话号码 当为电话号码输入数据时,此功能起作用。但如果只搜索名字,光标将返

假设您有三个文本框,可以用来搜索数据。每个文本框将对应于DB2表上的一列。您输入的搜索字符串将插入where子句。例如,您有名字、姓氏和电话号码。如果不在特定的文本框中输入数据,我会在where子句中将其默认值设置为“_”,通配符用于选择所有内容。另外,假设电话号码在表中定义为空

如果用户输入了要搜索的电话号码,则将使用Cursor1。所以where子句看起来像这样:

名字在哪里,比如:名字和 姓氏如:lastname和 电话号码

当为电话号码输入数据时,此功能起作用。但如果只搜索名字,光标将返回部分结果或不返回结果,因为:number主机变量将填充“uu”通配符。类似于“\u”的PHONE\u NBR将只返回具有实际值的行。如果与您搜索的名字匹配的行上的PHONE_NBR为空,则该行不会显示。所以我创建了第二个光标

如果用户尚未输入要搜索的电话号码,则将使用Cursor2。Where子句看起来像这样

名字在哪里,比如:名字和 姓氏如:lastname和 (电话号码:或 电话号码(无效)

同样,如果只搜索一个名字,PHONE_NBR中的一些值有数据,一些值为空,那么所有与搜索的名字匹配的内容都会显示在结果中——这很好。对于在PHONE_NBR中具有值的行,PHONE_NBR(如“_”)将获得这些值。对于PHONE_NBR中为null的行,PHONE_NBR为null将获取这些行


这是一个微小但必要的区别。由于这个微小的差异,我想将这两个游标合并为一个。如何才能达到相同的结果呢?

伊恩,我认为区别在于,如果用户提供了一个数字,他不想返回带有null的行。始终使用游标2将返回空行以及匹配的数字


您可以尝试一个基于:number的
CASE
语句……尽管我不确定是否可以使用带有“is null”语法的CASE。我知道如果您只是检查不同的值(等于、小于等),您可以这样做。

我建议处理这个问题的方法是构建查询,只在用户输入数据的列上提供条件。即:

  • 如果用户在First_Name文本框中输入了某些内容,则存在如下条件:

    FIRST_NAME LIKE '...'
    
    LAST_NAME LIKE '...'
    
    PHONE_NBR LIKE '...'
    
  • 如果用户在“姓氏”文本框中输入了某些内容,则存在如下条件:

    FIRST_NAME LIKE '...'
    
    LAST_NAME LIKE '...'
    
    PHONE_NBR LIKE '...'
    
  • 如果用户在Phone_Nbr(电话号码)文本框中输入内容,则您有以下情况:

    FIRST_NAME LIKE '...'
    
    LAST_NAME LIKE '...'
    
    PHONE_NBR LIKE '...'
    
在每种情况下,3个点表示从文本框中键入的信息派生的字符串,进行转换的函数完全知道引用(以避免SQL注入)

如果用户在两个或三个文本框中键入,则独立条件由AND连接。如果用户未键入任何内容,则可以生成同义反复,例如
1=1
,作为条件

然后将该条件附加到SQL语句的WHERE子句中,然后安排执行它


这是ibminformix4gl中CONSTRUCT语句提供的技术;自1986年以来,它一直在那里可用。它允许除LIKE以外的其他条件,例如等于、小于、大于或等于、范围,甚至是一个替代列表(对于IN('val1'、'val2'、…)条件),并且它可以用于所有数据类型。

不确定您在问什么。第二个光标将包括第一个光标中的所有行以及包含电话号码为空的任何行。感谢您的回复。最后,我在select and where中使用了IFNULL(),它将该列中的任何null值替换为“0”和一个临时变量。所以在这种情况下,它将是选择。。。如果用户希望搜索电话号码,则我将temp设置为9,以便只选择请求的电话号码。如果没有输入电话号码,则我将默认:number设置为“u”,并设置:temp=0,以便选择任何为空和非空的内容。