# 第116章 SQL函数 REPLACE 字符串函数,用于替换字符串中的子字符串。 # 大纲 ```java REPLACE(string,oldsubstring,newsubstring) ``` # 参数 - `string` - 作为子字符串搜索目标的字符串表达式。 - `oldsubstring` - 字符串中要匹配的子字符串。 - `newsubstring` - 用于替换 `oldsubstring` 的子字符串。 # 描述 `REPLACE` 在字符串中搜索子字符串并替换所有匹配项。匹配区分大小写。如果找到匹配项,它将用 `newsubstring` 替换 `oldsubstring` 的每个实例。替换子串可能比它替换的子串长或短。如果找不到子字符串,则 `REPLACE` 将原样返回原字符串。 无论字符串的数据类型如何,`REPLACE` 返回的值始终是数据类型 `VARCHAR`。这允许替换操作,例如 `REPLACE(12.3,'.','_')`。 `REPLACE` 不能对字符串、`oldsubstring` 或 `newsubstring` 参数使用 `%Stream.GlobalCharacter` 字段。尝试这样做会生成 `SQLCODE -37` 错误。 空字符串是字符串值。因此,可以将空字符串用于任何参数值。但是,请注意 ObjectScript 空字符串作为 `NULL` 传递给 `SQL`。 `NULL` 不是 `SQL` 中的数据值。因此,为任何 `REPLACE` 参数指定 `NULL` 将返回 `NULL`,无论是否发生匹配。 此函数提供与 `Transact-SQL` 实现的兼容性。 # REPLACE, STUFF, and $TRANSLATE `REPLACE` 和 `STUFF` 都执行子字符串替换。 `REPLACE` 按数据值搜索子字符串。 `STUFF` 按字符串位置和长度搜索子字符串。 `REPLACE` 执行单个字符串对字符串的匹配和替换。 `$TRANSLATE` 执行逐字符匹配和替换;它可以用相应的指定替换单个字符替换一个或多个指定单个字符的所有实例。它还可以从字符串中删除一个或多个指定单个字符的所有实例。 默认情况下,所有三个函数都区分大小写并替换所有匹配的实例。 # 示例 以下示例搜索子字符串`“P”`的每个实例并将其替换为子字符串`“K”`: ```sql SELECT REPLACE('PING PONG','P','K') KING KONG ``` 以下嵌入式 `SQL` 示例搜索子字符串`“KANSAS”`的每个实例,并将其替换为子字符串`“NEBRASKA”`: ```java /// d ##class(PHA.TEST.SQLFunction).Replace() ClassMethod Replace() { s str = "KANSAS, ARKANSAS, NEBRASKA" &sql( SELECT REPLACE(:str,'KANSAS','NEBRASKA') INTO :x ) w !,"SQLCODE=",SQLCODE w !,"Output string=",x } ``` ```java DHC-APP>d ##class(PHA.TEST.SQLFunction).Replace() SQLCODE=0 Output string=NEBRASKA, ARNEBRASKA, NEBRASKA ``` 以下示例显示 `REPLACE` 处理空字符串 (`''`) 就像处理任何其他字符串值一样: ```sql SELECT REPLACE('','','Nothing'), REPLACE('PING PONG','','K'), REPLACE('PING PONG','P','') Nothing PING PONG ING ONG ``` 以下示例显示 `REPLACE` 通过返回 `NULL` 来处理任何 `NULL` 参数。以下所有 `REPLACE` 函数都返回 `NULL`,包括最后一个,其中不发生匹配: ```sql SELECT REPLACE(NULL,'K','P'), REPLACE(NULL,NULL,'P'), REPLACE('PING PONG',NULL,'K'), REPLACE('PING PONG','P',NULL), REPLACE('PING PONG','Z',NULL) NULL NULL NULL NULL NULL ``` 以下嵌入式 SQL 示例与前面的 `NULL` 示例相同。它显示了如何在 SQL 中将 `ObjectScript` 空字符串主变量视为 `NULL`: ```java /// d ##class(PHA.TEST.SQLFunction).Replace1() ClassMethod Replace1() { s a = "" &sql( SELECT REPLACE(:a,'K','P'), REPLACE(:a,:a,'P'), REPLACE('PING PONG',:a,'K'), REPLACE('PING PONG','P',:a), REPLACE('PING PONG','Z',:a) INTO :v,:w,:x,:y,:z ) w !,"SQLCODE=",SQLCODE w !,"Output string=",v w !,"Output string=",w w !,"Output string=",x w !,"Output string=",y w !,"Output string=",z } ``` ```java DHC-APP>d ##class(PHA.TEST.SQLFunction).Replace1() SQLCODE=0 Output string= Output string= Output string= Output string= Output string= ```