文章
姚 鑫 · 三月 16 阅读大约需 4 分钟

第八十三章 SQL函数 $LISTFIND

第八十三章 SQL函数 $LISTFIND

列表函数,用于在指定列表中搜索请求的值。

大纲

$LISTFIND(list,value[,startafter])

参数

  • list - 计算结果为有效列表的表达式。列表是包含一个或多个元素的编码字符串。您可以使用 SQL 或 ObjectScript 的 $LISTBUILD$LISTFROMSTRING 函数创建列表。可以使用 SQL 或 ObjectScript $LIST 函数从现有列表中提取列表。
  • value - 包含搜索元素的表达式。一个字符串。
  • startafter - 可选 — 解释为列表位置的整数表达式。搜索从该位置之后的元素开始。0–1 是有效值; –1 从不返回元素。零是默认值。

描述

$LISTFIND 在指定列表中搜索请求值的第一个实例。搜索从 startafter 参数指示的位置之后的元素开始。如果省略 startafter 参数,则 $LISTFIND 假定 startafter 值为 0 并从第一个元素(元素 1)开始搜索。如果找到该值,则 $LISTFIND 返回匹配元素的位置。如果未找到该值,则 $LISTFIND 返回 0。如果 startafter 参数的值引用不存在的列表成员,则 $LISTFIND 函数也将返回 0

此函数返回 SMALLINT 类型的数据。

示例

以下嵌入式 SQL 示例返回 2,即请求字符串第一次出现的位置:

/// d ##class(PHA.TEST.SQLFunction).ListFind()
ClassMethod ListFind()
{
    s a = $lb("Red","Blue","Green")
    &sql(
        SELECT $LISTFIND(:a, 'Blue') INTO :b
    )
    if SQLCODE '= 0 {
        w !,"Error code ",SQLCODE 
    } else {
        w !,"The position is ",b 
    }
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).ListFind()

The position is 2

以下嵌入式 SQL 示例返回 0,表示未找到请求的字符串:

/// d ##class(PHA.TEST.SQLFunction).ListFind1()
ClassMethod ListFind1()
{
    s a = $lb("Red","Blue","Green")
    &sql(
        SELECT $LISTFIND(:a, 'Orange') INTO :b
    )
    if SQLCODE '= 0 {
        w !,"Error code ",SQLCODE 
    } else {
        w !,"The position is ",b 
    }
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).ListFind1()

The position is 0

以下三个嵌入式 SQL 示例显示了使用 startafter 参数的效果。第一个示例没有找到请求的字符串并返回 0,因为请求的字符串出现在 startafter 位置:

/// d ##class(PHA.TEST.SQLFunction).ListFind2()
ClassMethod ListFind2()
{
    s a = $lb("Red","Blue","Green")
    &sql(
        SELECT $LISTFIND(:a, 'Blue', 2) INTO :b
    )
    if SQLCODE '= 0 {
        w !,"Error code ",SQLCODE 
    } else {
        w !,"The position is ",b 
    }
}

DHC-APP>d ##class(PHA.TEST.SQLFunction).ListFind2()

The position is 0

第二个示例通过将 startafter 设置为零(默认值)来在第一个位置找到请求的字符串:

/// d ##class(PHA.TEST.SQLFunction).ListFind3()
ClassMethod ListFind3()
{
    s a = $lb("Red","Blue","Green")
    &sql(
        SELECT $LISTFIND(:a, 'Red', 0) INTO :b
    )
    if SQLCODE '= 0 {
        w !,"Error code ",SQLCODE 
    } else {
        w !,"The position is ",b 
    }
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).ListFind3()

The position is 1

第三个示例找到请求的字符串的第二次出现并返回 5,因为第一次出现在 startafter 位置之前:

/// d ##class(PHA.TEST.SQLFunction).ListFind4()
ClassMethod ListFind4()
{
    s a = $lb("Red","Blue","Green","Yellow","Blue")
    &sql(
        SELECT $LISTFIND(:a, 'Blue', 3) INTO :b
    )
    if SQLCODE '= 0 {
        w !,"Error code ",SQLCODE 
    } else {
        w !,"The position is ",b 
    }
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).ListFind4()

The position is 5

$LISTFIND 函数只匹配完整的元素。因此,以下示例返回 0,因为列表中没有元素等于字符串“B”,尽管所有元素都包含“B”

/// d ##class(PHA.TEST.SQLFunction).ListFind5()
ClassMethod ListFind5()
{
    s a = $lb("ABC", "BCD", "BBB")
    &sql(
        SELECT $LISTFIND(:a,'B') INTO :b
    )
    if SQLCODE '= 0 {
        w !,"Error code ",SQLCODE 
    } else {
        w !,"The position is ",b 
    }
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).ListFind5()

The position is 0

注意

无效的参数值

如果列表参数中的表达式未计算为有效列表,则 $LISTFIND 函数会生成 SQLCODE -400 致命错误。

/// d ##class(PHA.TEST.SQLFunction).ListFind6()
ClassMethod ListFind6()
{
    s a = "Blue"
    &sql(
        SELECT $LISTFIND(:a, 'Blue') INTO :b
    )
    if SQLCODE '= 0 {
        w !,"Error code ",SQLCODE 
    } else {
        w !,"The position is ",b 
    }
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).ListFind6()

Error code -400

如果 startafter 参数的值为 -1,则 $LISTFIND 始终返回零 (0)

/// d ##class(PHA.TEST.SQLFunction).ListFind7()
ClassMethod ListFind7()
{
    s a = $lb("Red", "Blue", "Green")
    &sql(
        SELECT $LISTFIND(:a, 'Blue', -1) INTO :b
    )
    if SQLCODE '= 0 {
        w !,"Error code ",SQLCODE 
    } else {
        w !,"The position is ",b 
    }
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).ListFind7()

The position is 0

如果 startafter 参数的值小于 -1,则调用 $LISTFIND 函数会生成 SQLCODE -400 致命错误。

/// d ##class(PHA.TEST.SQLFunction).ListFind8()
ClassMethod ListFind8()
{
    s a = $lb("Red", "Blue", "Green")
    &sql(
        SELECT $LISTFIND(:a, 'Blue', -3) INTO :b
    )
    if SQLCODE '= 0 {
        w !,"Error code ",SQLCODE 
    } else {
        w !,"The position is ",b 
    }
}

DHC-APP>d ##class(PHA.TEST.SQLFunction).ListFind8()

Error code -400
0
0 11
讨论 (0)1
登录或注册以继续