DB2 - 处理定义为null的列

时间:2010-12-15 02:58:39

标签: db2

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

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

FIRST_NAME喜欢的地方:名字和       LAST_NAME喜欢:姓氏和       PHONE_NBR喜欢:号码

这为电话号码输入数据时有效。但是如果仅对First Name进行搜索,则游标返回部分或无结果,因为:number主变量将填充“_”通配符.PHONE_NBR类似'_'将仅返回具有实际值的行。如果PHONE_NBR在与您搜索的First Name匹配的行上为空,则该行不会显示。所以我创建了第二个游标。

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

FIRST_NAME喜欢的地方:名字和       LAST_NAME喜欢:姓氏和       (PHONE_NBR喜欢:数字OR        PHONE_NBR为空)

同样,如果仅对名字进行搜索,并且PHONE_NBR中的某些值包含数据,则某些值为空,与搜索到的第一个名称匹配的一切将显示在结果中 - 这很好。对于PHONE_NBR中值为的行,PHONE_NBR(如'_')将获得这些行。对于PHONE_NBR中为空的行,PHONE_NBR IS NULL将获得那些。

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

2 个答案:

答案 0 :(得分:0)

Ian,我认为不同之处在于,如果用户提供了一个他不想返回空行的数字。一直使用游标2将返回带有null的行以及匹配的数字。

您可以尝试CASE语句基于:number ...虽然我不确定您是否可以使用带有“is null”语法的CASE。我知道如果你只是检查不同的值(等于,小于等),你可以。

答案 1 :(得分:0)

我建议处理此问题的方法是构建查询以仅在用户输入数据的列上提供条件。那就是:

  • 如果用户在First_Name文本框中输入内容,则您的条件如下:

    FIRST_NAME LIKE '...'
    
  • 如果用户在Last_Name文本框中输入内容,则您的条件如下:

    LAST_NAME LIKE '...'
    
  • 如果用户在Phone_Nbr文本框中输入内容,则您的条件如下:

    PHONE_NBR LIKE '...'
    

在每种情况下,3个点表示从输入到文本框中的信息派生的字符串,执行该转换的函数完全了解引用(以避免SQL注入)。

如果用户键入两个或三个文本框,则独立条件由AND连接。如果用户没有输入任何内容,您可以生成1 = 1等重复,作为条件。

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

这是IBM Informix 4GL中CONSTRUCT语句提供的技术;它自1986年以来一直在那里使用。它允许除LIKE以外的条件,例如等于,小于,大于或等于范围,或甚至是一系列备选方案(对于IN('val1','val2') ,...)condition),它可以用于所有数据类型。