SQL函数 ISNULL
测试NULL
并返回相应表达式的函数。
大纲
代码语言:javascript复制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"
}
代码语言:javascript复制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"
}
代码语言:javascript复制DHC-APP>d ##class(PHA.TEST.SQLCommand).IsNull1()
Name ColorChoice
yaoxin
xiaoli No Preference
姚鑫 No Preference
姚鑫 No Preference
姚鑫 No Preference
姚鑫
姚鑫