SQL函数 $EXTRACT
按位置从字符串中提取字符的字符串函数。
大纲
代码语言:javascript复制$EXTRACT(string[,from[,to]])
参数
-
string
- 要从中提取子字符串的目标字符串。 -
from
- 可选-单个字符在目标字符串中的位置,或要提取的字符范围(包括)的开头。 指定为从1
开始计数的正整数。 -
to
- 可选-要提取的字符范围的结束位置(包括)。 指定为从1
开始计数的正整数。
描述
$EXTRACT
返回字符串中指定位置的子字符串。
返回的子字符串的性质取决于所使用的参数。
-
$EXTRACT(string)
提取字符串中的第一个字符。 -
$EXTRACT(string,from)
从from
指定的位置提取字符。 例如,如果变量var1
包含字符串“ABCD”
,下面的命令提取“B”
(第二个字符):
SELECT $EXTRACT('ABCD',2) AS Extracted
2
-
$EXTRACT(string,from,to)
提取以from位
置开始,以to
位置结束的字符范围。 例如,下面的命令从字符串“1234Alabama567”
中提取字符串“Alabama”
(即从位置5
到位置11
的所有字符,包括在内):
SELECT $EXTRACT('1234Alabama567',5,11) AS Extracted
Alabama
这个函数返回VARCHAR
类型的数据。
参数
string
字符串值可以是变量名、数字值、字符串字面值或任何有效表达式。
from
from
值必须是正整数(但是,请参见注释)。
如果是小数,则截断该小数部分,只使用整数部分。
如果from
值大于字符串中的字符数,$EXTRACT
返回一个空字符串。
如果指定了from
而没有指定to
参数,则提取指定的单个字符。
如果与to
参数一起使用,它标识要提取的范围的开始,并且必须小于to
的值。
如果from = to
, $EXTRACT
返回指定位置的单个字符。
如果from
大于to
, $EXTRACT
返回一个空字符串。
to
to
参数必须与from
参数一起使用。
它必须是一个正整数。
如果是小数,则截断该小数部分,只使用整数部分。
如果to
的值大于或等于from
的值,$EXTRACT
返回指定的子字符串。
如果to
大于字符串的长度,$EXTRACT
返回从位置到字符串末尾的子字符串。
如果to
小于from
, $EXTRACT
返回一个空字符串。
示例
下面的示例返回字符串中的第四个字符" S
":
SELECT $EXTRACT('THIS IS A TEST',4) AS Extracted
S
下面的示例返回由第一个到第7个字符组成的子字符串“THIS IS”
。
SELECT $EXTRACT('THIS IS A TEST',1,7) AS Extracted
THIS IS
下面的嵌入式SQL示例从a
中提取第二个字符(“B”
),并将这个值赋给变量y
。
ClassMethod Extract()
{
s a="ABCD"
&sql(SELECT $EXTRACT(:a,2) INTO :y)
if SQLCODE '= 0 {
w !,"Error code ",SQLCODE }
else {
w !,"The extract returns ",y }
}
代码语言:javascript复制DHC-APP>d ##class(PHA.TEST.SQLCommand).Extract()
The extract returns B
下面的嵌入式SQL示例显示,当from
值为“1”
时,单参数格式等价于双参数格式。
两个$EXTRACT
函数都返回" H "
。
/// d ##class(PHA.TEST.SQLCommand).Extract1()
ClassMethod Extract1()
{
s a="HELLO"
&sql(SELECT $EXTRACT(:a),$EXTRACT(:a,1) INTO :b,:c)
if SQLCODE'=0 {
w !,"Error code ",SQLCODE }
else {
w !,"The one-arg form returns ",b
w !,"The two-arg form returns ",c }
}
代码语言:javascript复制DHC-APP>d ##class(PHA.TEST.SQLCommand).Extract1()
The one-arg form returns H
The two-arg form returns H
注意
PIECE和$LIST比较
$EXTRACT
从字符串中按整数位置返回一个子字符串。
$PIECE
和$LIST
都适用于特殊格式的字符串。
$PIECE
从标准字符串中使用分隔符返回子字符串。
$LIST
通过元素的整数位置(不是字符)返回编码列表中的元素的子列表。
$LIST
不能用于普通字符串,而$EXTRACT
不能用于编码列表。
$EXTRACT
、$FIND
、$LENGTH
和$PIECE
函数对标准字符串进行操作。
各种$LIST
函数对编码的字符串进行操作,这些字符串与标准字符串不兼容。
唯一的例外是$LISTGET
函数和$LIST
的单参数和双参数形式,它们接受已编码的字符串作为输入,但将单个元素值作为标准字符串输出。
$EXTRACT 与 Unicode
$EXTRACT
函数对字符而不是字节进行操作。
因此,Unicode
字符串的处理方式与ASCII
字符串相同,如下所示的嵌入式SQL示例使用Unicode
字符"pi"
($CHAR(960)
):
ClassMethod Extract2()
{
s a="QT PIE"
s b=("QT "_$CHAR(960))
&sql(SELECT
$EXTRACT(:a,-33,4),
$EXTRACT(:a,4,4),
$EXTRACT(:a,4,99),
$EXTRACT(:b,-33,4),
$EXTRACT(:b,4,4),
$EXTRACT(:b,4,99)
INTO :a1,:a2,:a3,:b1,:b2,:b3)
if SQLCODE'=0 {
w !,"Error code ",SQLCODE }
else {
w !,"ASCII form returns ",!,a1,!,a2,!,a3
w !,"Unicode form returns ",!,b1,!,b2,!,b3 }
}
代码语言:javascript复制DHC-APP> d ##class(PHA.TEST.SQLCommand).Extract2()
ASCII form returns
QT P
P
PIE
Unicode form returns
QT π
π
π
Null和无效参数
- 当
string
为null
字符串时,返回一个null
字符串。 - 当
from
是一个大于字符串长度的数字时,将返回一个空字符串。 - 当
from
为零或负数,并且指定了no to
时,将返回一个空字符串。 - 当
to
为零、负数或比from
小的数字时,将返回一个空字符串。 - 当
to
为有效值时,from
可以为零或负数。$EXTRACT
将这些值视为1
。
无效的参数值不会产生SQLCODE
错误。
在下面的例子中,from
值的负数被计算为1
;
$EXTRACT
返回由第一个到第7个字符组成的子字符串“THIS IS”
。
SELECT $EXTRACT('THIS IS A TEST',-7,7)
THIS IS
在下面的嵌入式SQL示例中,所有的$EXTRACT
函数调用都返回空字符串:
ClassMethod Extract3()
{
s a="THIS IS A TEST"
s b=""
&sql(SELECT
$EXTRACT(:a,33),
$EXTRACT(:a,-7),
$EXTRACT(:a,3,2),
$EXTRACT(:a,-7,0),
$EXTRACT(:a,-7,-10),
$EXTRACT(:b,-33,4),
$EXTRACT(:b,4,4),
$EXTRACT(:b,4,99),
$EXTRACT(NULL,-33,4),
$EXTRACT(NULL,4,4),
$EXTRACT(NULL,4,99)
INTO :a1,:a2,:a3,:a4,:a5,:b1,:b2,:b3,:c1,:c2,:c3)
if SQLCODE'=0 {
w !,"Error code ",SQLCODE }
else {
w !,"FROM too big: ",a1
w !,"FROM negative, no TO: ",a2
w !,"TO smaller than FROM: ",a3
w !,"TO not a positive integer: ",a4,a5
w !,"LIST is null string: ",b1,b2,b3,c1,c2,c3 }
}
代码语言:javascript复制DHC-APP>d ##class(PHA.TEST.SQLCommand).Extract3()
FROM too big:
FROM negative, no TO:
TO smaller than FROM:
TO not a positive integer:
LIST is null string: