# 第129章 SQL函数 %SQLUPPER 将值排序为大写字符串的排序规则函数。 # 大纲 ```java %SQLUPPER(expression[,maxlen]) %SQLUPPER expression ``` # 参数 - `expression` - 字符串表达式,可以是列名、字符串文字或另一个函数的结果,其中基础数据类型可以表示为任何字符类型(例如 `CHAR` 或 `VARCHAR`)。表达式可以是子查询。 - `maxlen` - 可选 — 一个整数,指定整理后的值将被截断为 `maxlen` 的值。请注意, `maxlen` 包括附加的前导空格。您可以用双括号将 `maxlen` 括起来以抑制文字替换:((`maxlen`))。 # 描述 `SQLUPPER` 是默认排序规则。 `%SQLUPPER` 将表达式转换为排序为(不区分大小写)大写字符串的格式。 `%SQLUPPER` 将所有字母字符转换为大写,从字符串中去除尾随空格(空格、制表符等),然后在字符串开头添加一个前导空格。这个附加的空格会导致 `NULL` 和数值被整理为字符串。 `SQL` 在将数字传递给函数之前将数值转换为规范形式(删除前导零和尾随零、扩展指数等)。 `SQL` 不会将数字字符串转换为规范形式。 因为 `%SQLUPPER` 将空格附加到所有值,所以它将 `NULL` 值作为空格进行整理,字符串长度为 `1`。 `%SQLUPPER` 将任何仅包含空格(空格、制表符等)的值整理为 SQL 空字符串 (`''`)。当 `%SQLUPPER` 将空格附加到空(零长度)字符串时,它会将空格加上空字符串的内部表示形式 `$CHAR(0)` 进行整理,从而导致字符串长度为 `2`。 可选的 `maxlen` 参数在索引或整理时将转换后的表达式字符串截断为指定的字符数。例如,如果插入带有 `maxlen` 截断的字符串,则插入完整的字符串,并且可以通过 `SELECT` 语句检索;此字符串的全局索引被截断为指定长度。这意味着 `ORDER BY` 和比较操作仅计算截断的索引字符串。这种截断对于对超过下标的最大字符长度的字符串进行索引特别有用。使用 `maxlen` 参数,如果需要对长字段进行索引,可以使用截断长度参数。 `%SQLUPPER` 转换表达式后执行 `maxlen` 截断;如果 `maxlen` 超过转换后的表达式的长度,则不添加填充。最大字符串长度为 `3,641,144` 个字符; `maxlen` 没有强制执行最大值。 可以使用 `%SYSTEM.Util` 类的 `Collation()` 方法在 `ObjectScript` 中执行相同的排序规则转换: ```java DHC-APP> WRITE $SYSTEM.Util.Collation("The quick, BROWN fox.",7) THE QUICK, BROWN FOX. ``` 也可以使用 `SQLUPPER()` 方法调用从 ObjectScript 调用此函数: ```java DHC-APP> WRITE $SYSTEM.SQL.SQLUPPER("The quick, BROWN fox.") THE QUICK, BROWN FOX. ``` 这两种方法都支持 `SQLUPPER` 转换后的截断。请注意,截断长度必须包括附加的空白: ```java DHC-APP>WRITE $SYSTEM.Util.Collation("The quick, BROWN fox.",7,6) THE Q DHC-APP>WRITE $SYSTEM.SQL.SQLUPPER("The quick, BROWN fox.",6) THE Q ``` 注意:要将系统范围的默认排序规则从 `%SQLUPPER`(不区分大小写)更改为 `%SQLSTRING`(区分大小写),请使用以下命令: ```java WRITE $$SetEnvironment^%apiOBJ("collation","%Library.String","SQLSTRING") ``` 发出此命令后,必须清除索引,重新编译所有类,然后重建索引。不要在其他用户访问表的数据时重建索引。这样做可能会导致查询结果不准确。 # 其他大小写转换函数 `%SQLUPPER` 函数是 SQL 中转换数据值以进行不区分大小写的比较或排序规则的首选方法。 `%SQLUPPER` 在数据的开头添加一个前导空格,这会强制将数字数据和 NULL 值解释为字符串。 以下是转换数据值大小写的其他函数: - `UPPER` 和 `UCASE`:将字母转换为大写,对数字字符、标点字符、嵌入空格以及前导和尾随空格没有影响。不强制将数字解释为字符串。 - `LOWER` 和 `LCASE`:将字母转换为小写,对数字字符、标点字符、嵌入空格以及前导和尾随空格没有影响。不强制将数字解释为字符串。 - `%SQLSTRING`:不转换字母大小写。但是,它会在数据的开头添加一个前导空格,这会强制将数字数据和 NULL 值解释为字符串。 # 字母数字整理顺序 大小写转换函数使用不同的算法整理以数字开头的数据值,如下所示: - `%MVR` - 6 Oak Avenue, 66 Main Street, 66 Oak Street, 641 First Place, 665 Ash Drive, 672 Main Court, 709 Oak Avenue, 5988 Clinton Avenue, 6023 Washington Court, 6090 Elm Court, 6185 Clinton Drive, 6209 Clinton Street, 6284 Oak Drive, 6310 Franklin Street, 6406 Maple Place, 6572 First Avenue, 6643 First Street, 6754 Oak Court, 6986 Madison Blvd, 7000 Ash Court, - `%SQLUPPER`、`%SQLSTRING` 和所有其他大小写转换函数 - 5988 Clinton Avenue, 6 Oak Avenue, 6023 Washington Court, 6090 Elm Court, 6185 Clinton Drive, 6209 Clinton Street, 6284 Oak Drive, 6310 Franklin Street, 6406 Maple Place, 641 First Place, 6572 First Avenue, 66 Main Street, 66 Oak Street, 6643 First Street, 665 Ash Drive, 672 Main Court, 6754 Oak Court, 6986 Madison Blvd, 7000 Ash Court, 709 Oak Avenue, # 示例 以下查询使用带有字符串截断的 `%SQLUPPER` 以大写形式返回每个名称的前两个字符。请注意,字符串截断是 `3`(不是 `2`),因为 `%SQLUPPER` 添加了前导空格。 `ORDER BY` 子句使用这个两个字符的字段将行放在一个粗略的排序顺序中: ```sql SELECT Name, %SQLUPPER(Name,3) AS FirstTwo FROM Sample.Person ORDER BY FirstTwo ``` 以下示例将 `%SQLUPPER` 应用于子查询: ```sql SELECT TOP 5 Name, %SQLUPPER((SELECT Name FROM Sample.Company),10) AS Company FROM Sample.Person ```