文章
· 四月 30, 2022 阅读大约需 3 分钟

第128章 SQL函数 %SQLSTRING

第128章 SQL函数 %SQLSTRING

将值排序为字符串的排序规则函数。

大纲

%SQLSTRING(expression[,maxlen])

%SQLSTRING expression

参数

  • expression - 字符串表达式,可以是列名、字符串文字或另一个函数的结果,其中基础数据类型可以表示为任何字符类型(例如 CHARVARCHAR)。表达式可以是子查询。
  • maxlen - 可选 — 一个正整数,指定整理后的值将被截断为 maxlen 的值。请注意, maxlen 包括附加的前导空格。可以用双括号将 maxlen 括起来以抑制文字替换:((maxlen))。

描述

%SQLSTRING 将表达式转换为按(区分大小写)字符串排序的格式。 %SQLSTRING 从字符串中去除尾随空格(空格、制表符等),然后在字符串的开头添加一个前导空格。这个附加的空格强制将 NULL 和数值作为字符串进行整理。从数字中删除前导零和尾随零。

因为 %SQLSTRING 将空格附加到所有值,所以它将 NULL 值整理为空格,字符串长度为 1%SQLSTRING 将任何仅包含空格(空格、制表符等)的值整理为 SQL 空字符串('')。当 %SQLSTRING 将空格附加到空(零长度)字符串时,它会将空格加上空字符串的内部表示形式 $CHAR(0) 进行整理,从而导致字符串长度为 2

可选的 maxlen 参数在索引或整理时将表达式字符串截断为指定的字符数。例如,如果插入带有 maxlen 截断的字符串,则插入完整的字符串,并且可以通过 SELECT 语句检索;此字符串的全局索引被截断为指定长度。这意味着 ORDER BY 和比较操作仅评估截断的索引字符串。这种截断对于对超过下标的最大字符长度的字符串进行索引特别有用。使用 maxlen 参数,如果需要对长字段进行索引,可以使用截断长度参数。

%SQLSTRING 在转换表达式后执行 maxlen 截断;如果 maxlen 超过转换后的表达式的长度,则不添加填充。最大字符串长度为 3,641,144 个字符; maxlen 没有强制执行最大值。

可以使用 %SYSTEM.Util 类的 Collation() 方法在 ObjectScript 中执行相同的排序规则转换:

DHC-APP>  WRITE $SYSTEM.Util.Collation("The quick, BROWN fox.",8)
 The quick, BROWN fox.

也可以使用 SQLSTRING() 方法调用从 ObjectScript 调用此函数:

DHC-APP>  WRITE $SYSTEM.SQL.SQLSTRING("The quick, BROWN fox.")
 The quick, BROWN fox.

这两种方法都支持 SQLSTRING 转换后的截断。请注意,截断长度必须包括附加的空白:

DHC-APP>WRITE $SYSTEM.Util.Collation("The quick, BROWN fox.",8,6)
 The q
DHC-APP>WRITE $SYSTEM.SQL.SQLSTRING("The quick, BROWN fox.",6)
 The q

注意:要将系统范围的默认排序规则从 %SQLUPPER(不区分大小写)更改为 %SQLSTRING(区分大小写),请使用以下命令:

  WRITE $$SetEnvironment^%apiOBJ("collation","%Library.String","SQLSTRING")

发出此命令后,必须清除索引,重新编译所有类,然后重建索引。不要在其他用户访问表的数据时重建索引。这样做可能会导致查询结果不准确。

示例

以下查询在 WHERE 子句中使用 %SQLSTRING 来执行区分大小写的选择:

SELECT Name FROM Sample.Person
WHERE %SQLSTRING Name %STARTSWITH %SQLSTRING 'Al'
ORDER BY Name

默认情况下,%STARTSWITH 字符串比较不区分大小写。此示例使用 %SQLSTRING 格式使此比较区分大小写。它返回所有以“Al”开头的名称(例如 AllenAlton 等)。请注意,使用 %STARTSWITH 时,应将 %SQLSTRING排序规则应用于语句的两侧。

以下示例使用带有字符串截断的 %SQLSTRING 来返回每个名称的前两个字符。请注意,字符串截断是 3(不是 2),因为 %SQLSTRING 添加了前导空格。 ORDER BY 子句使用这个两个字符的字段将行放在一个粗略的排序顺序中:

SELECT Name, %SQLSTRING(Name,3) AS FirstTwo
FROM Sample.Person
ORDER BY FirstTwo

此示例在不更改字母大小写的情况下返回截断的值。

以下示例将 %SQLSTRING 应用于子查询:

SELECT TOP 5 Name, %SQLSTRING((SELECT Name FROM Sample.Company),10) AS Company
FROM Sample.Person
讨论 (0)1
登录或注册以继续