第六十六章 SQL函数 ISNULL
测试NULL 并返回相应表达式的函数。
大纲
ISNULL(check-expression,replace-expression)
参数
check-expression - 要计算的表达式。replace-expression - Check-Expression 为NULL 时返回的表达式。
ISNULL 返回与Check-Expression 相同的数据类型。
描述
ISNULL 计算check-expression 并返回以下两个值之一:
- 如果
check-expression 为NULL ,则返回Replace-Expression 。 - 如果
Check-Expression 不为空,则返回Check-Expression 。
Replace-Expression 的数据类型应该与Check-Expression 的数据类型兼容。
请注意,ISNULL 函数与NVL 函数相同,后者是为了与Oracle兼容而提供的。
日期和时间显示转换
某些检查表达式数据类型需要从逻辑模式转换为ODBC模式或显示模式。例如日期和时间数据类型。如果替换表达式值不是相同的数据类型,则不能在ODBC模式或显示模式下转换此值,并生成SQLCODE 错误:日期数据类型为-146 ;时间数据类型为-147 。例如,ISNULL(DOB,'nodate') 不能在ODBC模式或显示模式下执行;它会发出SQLCODE-146 错误,并显示 %msg Error: 'nodate' is an invalid ODBC/JDBC Date value or Error: 'nodate' is an invalid DISPLAY Date value 。要在ODBC模式或显示模式下执行此语句,必须将值强制转换为适当的数据类型:ISNULL(DOB,CAST('nodate' as DATE)) 。这将导致日期0,显示为1840-12-31 。
比较的NULL处理函数
下表显示了各种SQL比较函数。如果逻辑比较测试为True (A与B相同),则每个函数返回一个值;如果逻辑比较测试为False (A与B不同),则每个函数返回另一个值。这些函数允许您执行空逻辑比较。不能在实际相等(或不相等)条件比较中指定NULL 。
SQL Function | Comparison | Test Return Value |
---|
IFNULL(ex1,ex2) [two-argument form] | ex1 = NULL | True returns ex2 False returns NULL | IFNULL(ex1,ex2,ex3) [three-argument form] | ex1 = NULL | True returns ex2 False returns ex3 | {fn IFNULL(ex1,ex2)} | ex1 = NULL | True returns ex2 False returns ex1 | ISNULL(ex1,ex2) | ex1 = NULL | True returns ex2 False returns ex1 | NVL(ex1,ex2) | ex1 = NULL | True returns ex2 False returns ex1 | NULLIF(ex1,ex2) | ex1 = ex2 | True returns NULL False returns ex1 | COALESCE(ex1,ex2,…) | ex = NULL for each argument | True tests next ex argument. If all ex arguments are True (NULL), returns NULL. False returns ex |
示例
在下面的示例中,第一个ISNULL 返回第二个表达式(99),因为第一个表达式为空。第二个ISNULL 返回第一个表达式(33),因为第一个表达式不为空:
SELECT ISNULL(NULL,99) AS IsNullT,ISNULL(33,99) AS IsNullF
99 33
如果FavoriteColors 为NULL ,下面的动态SQL示例将返回字符串‘No Preference’ ;否则,它将返回FavoriteColors 的值:
ClassMethod IsNull()
{
s myquery=3
s myquery(1)="SELECT Name,"
s myquery(2)="ISNULL(FavoriteColors,'No Preference') AS ColorChoice "
s myquery(3)="FROM Sample.Person"
s tStatement = ##class(%SQL.Statement).%New()
s qStatus = tStatement.%Prepare(.myquery)
s rset = tStatement.%Execute()
d rset.%Display()
w !,"End of data"
}
DHC-APP> d ##class(PHA.TEST.SQLCommand).IsNull()
Name ColorChoice
yaoxin $lb("Red","Orange","Yellow")
xiaoli No Preference
姚鑫 No Preference
姚鑫 No Preference
姚鑫 No Preference
姚鑫 $lb("Red","Orange","Yellow","Green")
姚鑫 $lb("Red","Orange","Yellow","Green","Green")
将ISNULL 的行为与IFNULL 进行比较:
ClassMethod IsNull1()
{
s myquery=3
s myquery(1)="SELECT Name,"
s myquery(2)="IFNULL(FavoriteColors,'No Preference') AS ColorChoice "
s myquery(3)="FROM Sample.Person"
s tStatement = ##class(%SQL.Statement).%New()
s qStatus = tStatement.%Prepare(.myquery)
s rset = tStatement.%Execute()
d rset.%Display()
w !,"End of data"
}
DHC-APP>d ##class(PHA.TEST.SQLCommand).IsNull1()
Name ColorChoice
yaoxin
xiaoli No Preference
姚鑫 No Preference
姚鑫 No Preference
姚鑫 No Preference
姚鑫
姚鑫
|