文章目录
- 第八十七章 SQL函数 $LISTSAME
- 大纲
- 参数
- 描述
- 参数
- 示例
第八十七章 SQL函数 $LISTSAME
比较两个列表并返回布尔值的列表函数。
大纲
$LISTSAME(list1,list2)
参数
-
list1
- 计算结果为有效列表的表达式。 -
list2
- 计算结果为有效列表的表达式。
描述
$LISTSAME
比较两个列表的内容,如果列表相同则返回 1
。如果列表不相同,则 $LISTSAME
返回 0
。$LISTSAME
逐个元素地比较两个列表。对于两个相同的列表,它们必须包含相同数量的元素,并且 list1
中的每个元素必须与 list2
中的相应元素匹配。
$LISTSAME
使用它们的字符串表示来比较列表元素。 $LISTSAME
比较区分大小写。 $LISTSAME
按从左到右的顺序逐个元素地比较两个列表。因此,$LISTSAME
在遇到第一个不匹配的列表元素对时返回值 0
;它不检查后续项目以确定它们是否是有效的列表元素。
此函数返回 SMALLINT
类型的数据。
参数
list (list1 and list2)
列表是包含一个或多个元素的编码字符串。可以使用 SQL $LISTBUILD
函数或 ObjectScript $LISTBUILD
函数创建列表。可以使用 SQL $LISTFROMSTRING
函数或 ObjectScript $LISTFROMSTRING
函数将分隔字符串转换为列表。可以使用 SQL $LIST
函数或 ObjectScript $LIST
函数从现有列表中提取列表。
以下是有效列表的示例:
-
$LISTBUILD('a','b','c')
:一个三元素列表。 -
$LISTBUILD('a','','c')
:三元素列表,第二个元素为空字符串值。 -
$LISTBUILD('a',,'c')
或$LISTBUILD('a',NULL,'c')
:三元素列表,第二个元素没有值。 -
$LISTBUILD(NULL,NULL)
或$LISTBUILD(,NULL)
:包含两个元素的列表,其中的元素没有值。 -
$LISTBUILD(NULL)
或$LISTBUILD()
:单元素列表,该元素没有值。
如果列表参数为 NULL
,则 $LISTSAME
返回 NULL
。如果列表参数不是有效列表(并且不是 NULL
) SQL 会生成 SQLCODE -400
致命错误。
示例
以下嵌入式 SQL 示例使用 $LISTSAME
比较两个列表参数:
/// d ##class(PHA.TEST.SQLFunction).ListSame()
ClassMethod ListSame()
{
s a = $lb("Red", , "Yellow", "Green", "", "Violet")
s b = $lb("Red", , "Yellow", "Green", "", "Violet")
&sql(
SELECT $LISTSAME(:a,:b)
INTO :c
)
if SQLCODE '= 0 {
w !,"Error code;",SQLCODE
} elseif c=1 {
w "lists a and b are the same",!
} else {
w "lists a and b are not the same",!
}
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).ListSame()
lists a and b are the same
以下 SQL 示例比较具有 NULL
、缺失或空字符串元素的列表:
SELECT $LISTSAME($LISTBUILD('Red',NULL,'Blue'),$LISTBUILD('Red',,'Blue')) AS NullAbsent,
$LISTSAME($LISTBUILD('Red',NULL,'Blue'),$LISTBUILD('Red','','Blue')) AS NullEmpty,
$LISTSAME($LISTBUILD('Red',,'Blue'),$LISTBUILD('Red','','Blue')) AS AbsentEmpty
0 0 0
$LISTSAME
比较与 ObjectScript 等号使用的等价测试不同。等号将两个列表作为编码字符串(逐个字符)进行比较; $LISTSAME
逐个元素地比较两个列表。在比较数字和数字字符串时很容易看出这种区别,如下例所示:
/// d ##class(PHA.TEST.SQLFunction).ListSame1()
ClassMethod ListSame1()
{
s a = $lb("365")
s b = $lb(365)
if a = b {
w "Equal sign: lists a and b are the same",!
} else {
w "Equal sign: lists a and b are not the same",!
}
&sql(
SELECT $LISTSAME(:a,:b)
INTO :c
)
if SQLCODE '= 0 {
w !,"Error code ",SQLCODE
} elseif c=1 {
w "$LISTSAME: lists a and b are the same",!
} else {
w "$LISTSAME: lists a and b are not the same",!
}
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).ListSame1()
Equal sign: lists a and b are not the same
$LISTSAME: lists a and b are the same
以下 SQL 示例比较了包含规范和非规范形式的数字和数字字符串的列表。比较数字列表元素和字符串列表元素时,字符串列表元素必须以规范形式表示数字;这是因为 IRIS 在执行比较之前总是将数字简化为规范形式。在以下示例中,$LISTSAME
比较字符串和数字。前三个 $LISTSAME
函数返回 1(相同);第四个 $LISTSAME
函数返回 0(不相同),因为字符串表示不是规范形式:
SELECT $LISTSAME($LISTBUILD('365'),$LISTBUILD(365)),
$LISTSAME($LISTBUILD('365'),$LISTBUILD(365.0)),
$LISTSAME($LISTBUILD('365.5'),$LISTBUILD(365.5)),
$LISTSAME($LISTBUILD('365.0'),$LISTBUILD(365.0))
1 1 1 0