您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

内置库 SQLSCRIPT_STRING

SQLSCRIPT_STRING 库为处理字符串提供了一种方便简单的方式。您可以使用给定的分隔符或正则表达式拆分库,设置字符串的格式或重新排列,并将表变量转换为已经可用的字符串。

语法

代码语法CREATE LIBRARY SYS.SQLSCRIPT_STRING LANGUAGE SQLSCRIPT AS BUILTINBEGIN FUNCTION SPLIT(IN VALUE NVARCHAR(5000), IN SEPARATOR NVARCHAR(5000), IN MAXSPLIT INT DEFAULT -1) RETURNS ...; FUNCTION SPLIT_TO_TABLE(IN VALUE NVARCHAR(5000), IN SEPARATOR NVARCHAR(5000), IN MAXSPLIT INT DEFAULT -1) RETURNS TABLE(RESULT NVARCHAR(5000)); FUNCTION SPLIT_TO_ARRAY(IN VALUE NVARCHAR(5000), IN SEPARATOR NVARCHAR(5000), IN MAXSPLIT INT DEFAULT -1) RETURNS RESULTS NVARCHAR(5000) ARRAY; FUNCTION SPLIT_REGEXPR(IN VALUE NVARCHAR(5000), IN REGEXPR NVARCHAR(5000), IN MAXSPLIT INT DEFAULT -1) RETURNS ...; FUNCTION SPLIT_REGEXPR_TO_TABLE(IN VALUE NVARCHAR(5000), IN REGEXPR NVARCHAR(5000), IN MAXSPLIT INT DEFAULT -1) RETURNS TABLE(RESULT NVARCHAR(5000)); FUNCTION SPLIT_REGEXPR_TO_ARRAY(IN VALUE NVARCHAR(5000), IN REGEXPR NVARCHAR(5000), IN MAXSPLIT INT DEFAULT -1) RETURNS RESULTS NVARCHAR(5000) ARRAY; FUNCTION FORMAT(IN FORMAT NVARCHAR(5000), IN ...) RETURNS RESULT NVARCHAR(8388607); FUNCTION FORMAT_TO_TABLE(IN FORMAT NVARCHAR(5000), IN TABLE(...)) RETURNS TABLE(RESULT NVARCHAR(8388607)); FUNCTION FORMAT_TO_ARRAY(IN FORMAT NVARCHAR(5000), IN TABLE(...)) RETURNS RESULTS NVARCHAR(8388607) ARRAY; FUNCTION TABLE_SUMMARY(IN TABLE TABLE(...), IN ROWS INT DEFAULT 100) RETURNS RESULT NVARCHAR(8388607); END;

SPLIT 系列功能

SPLIT/SPLIT_REGEXPR

SPLIT(_REGEXPR) 函数根据给定的参数返回多个变量。

  • 如果 MAXSPLIT 为 -1,则对拆分数没有限制。

  • 如果指定 MAXSPLIT,则最多进行 MAXSPLIT 拆分。

  • 空字符串作为输入将返回空字符串作为结果。

  • 不带分隔符作为输入的字符串返回整个给定字符串。

  • 以 N-1 分隔符作为输入的字符串返回以 N 分隔的字符串。

    SPLIT_TO_ARRAY / SPLIT_ REGEXPR TO_ARRAY

    SPLIT_TO_ARRAY(REGEXPR) 返回包含 N 个分隔字符串的 NVARCHAR(5000) 数组

  • 空字符串作为输入将返回空值的数组。

  • 无分隔符作为输入的字符串返回第一个元素中包含整个给定字符串的数组。

  • 以 N-1 分隔符作为输入的字符串返回由 N 个分隔的字符串组成的数组。

    SPLIT_TO_TABLE / SPLIT_REGEXPR_TO_TABLE

    SPLIT_TO_TABLE(_REGEXPR) 返回表类型为 (WORD NVARCHAR(5000)) 的单个列表

  • 空字符串作为输入将返回一个包含 0 行的单列表。

  • 无分隔符作为输入的字符串会在第一行返回整个给定字符串的单个列表。

  • 以 N-1 分隔符作为输入的字符串返回单个列表,其中字符串在 N 行中由 N 分隔。

  • 此函数可解释为 UNNEST(SPLIT_TO_ARRAY(val, sep)) AS ("WORD") 。

    示例代码DO BEGIN USING SQLSCRIPT_STRING AS LIB; DECLARE a1, a2, a3 INT; (a1, a2, a3) = LIB:SPLIT('10, 20, 30', ', '); --(10, 20, 30)END; DO BEGIN USING SQLSCRIPT_STRING AS LIB; DECLARE first_name, last_name STRING; DECLARE area_code, first_num, last_num INT; first_name = LIB:SPLIT('John Sutherland', ','); --('John Sutherland') (first_name, last_name) = LIB:SPLIT('John Sutherland', ' '); --('John','Sutherland') first_name = LIB:SPLIT('Brian', ' '); --('Brian') (first_name, last_name) = LIB:SPLIT('Brian', ' '); -- throw SQL_FEW_VALUES (first_name, last_name) = LIB:SPLIT('Michael Forsyth Jr', ' ');--throw SQL_MANY_VALUES (first_name, last_name) = LIB:SPLIT('Michael Forsyth Jr', ' ', 1); --('Michael', 'Forsyth Jr') (area_code, first_num, last_num) = LIB:SPLIT_REGEXPR('02)2143-5300', '\(|\)|-'); --(02, 2143, 5300)END; DO BEGIN USING SQLSCRIPT_STRING AS LIB; DECLARE arr INT ARRAY; DECLARE arr2 STRING ARRAY; DECLARE tv, tv2 TABLE(RESULT NVARCHAR(5000)); arr = LIB:SPLIT_TO_ARRAY('10,20,30,40,50',','); --array(10,20,30,40,50) arr2 = LIB:SPLIT_REGEXPR_TO_ARRAY('Blake Kelly; Fred Randall; Bell Walsh; Leonard Quinn; Chris McDonald', '\s*;\s*'); --array('Blake Kelly', 'Fred Randall', 'Bell Walsh', 'Leonard Quinn', 'Chris McDonald') tv = LIB:SPLIT_TO_TABLE('10,20,30,40,50',','); --table[(10),(20),(30),(40),(50)] tv2 = LIB:SPLIT_REGEXPR_TO_TABLE('10+20/30*40-50', '\+|\/|\*|-'); --table[(10),(20),(30),(40),(50)]END; 备注 SPLIT_TO_TABLE 函数当前不支持隐式表变量声明。 CREATE PROCEDURE SPLIT_TO_TABLE_TEST AS BEGIN USING SQLSCRIPT_STRING AS lib; DECLARE tv TABLE(RESULT NVARCHAR(5000)); --Needs explicit table variable declaration tv = LIB:SPLIT_TO_TABLE('a,b',','); SELECT * FROM :tv;END; CALL SPLIT_TO_TABLE_TEST(); -- [(a), (b)]

    FORMAT 系列功能

    FORMAT 字符串

    FORMAT 函数支持新的 Python 样式格式。

    代码语法replacement_field := "{" [field_name] [":"format_spec] "}"field_name := [column_name | integer]format_spec := [sign][0][width][.precision][type]sign := "+" | "-" | " "width := integerprecision := integertype := "s" | "b" | "c" | "d" | "o" | "x" | "X" | "e" | "E" | "f" | "F" | "g" | "G" 字符串表示类型 类型含义's'字符串格式没有与 's' 相同  整数表示类型 类型含义'b'二进制格式'c'字符'd'小数整数'o'Octal 格式'x'HEX 格式。在结果中使用小写字母'X'HEX 格式。在结果中使用大写字母没有与 'd' 相同  浮点和小数值表示类型 类型含义'e'指数表示法。缺省精度为 6。'E'指数表示法。在结果中使用大写字母 'E'。'f'固定点。缺省精度为 6。'F'固定点。NAN 用于 nan,INF 用于结果中的 inf。'g'常规格式。缺省精度为 6。类型为 'e',精度为 p-1,数字具有指数指数如果 -4 <= exp < p,则与 'f' 相同,精度为 p-1-exp否则,与 'e' 相同,精度为 p - 1'G'常规格式。在结果中使用大写字母 'E'。没有类似于 'g'。缺省精度为表示数字所需的高精度。 

    示例

    类型示例基本FORMAT('{} {}', 'one', 'two') => 'one two'FORMAT('{1} {0}', 1, 2) => '2 1'截断长字符串FORMAT('{:.5}', 'xylophone') =>'xylop'FORMAT('{:10.5}', 'xylophone') => 'xylop '编号FORMAT('{:d}', 42) => '42'FORMAT('{:f}', 3.141592653589793) => '3.141593'FORMAT('{:g}', 123456) => '123456'FORMAT('{:g}', 1234567) => '1.23456e+06'FORMAT('{:g}', 0.000123456) => '0.000123456'FORMAT('{:g}', 0.0000123456) => '1.23456e-05'填充编号FORMAT('{:4d}', 42) => ' 42'FORMAT('{:06.2f}', 3.141592653589793) => '003.14'FORMAT('{:04d}', 42) => '0042'带符号的编号FORMAT('{:+d}', 42) => '+42'FORMAT('{: d}', -23) => '-23'FORMAT('{: d}', 42) => ' 42'列名称tv = select 1 as first, 2 as last from dummy;FORMAT_TO _TABLE('{first} {last}', :tv) => [('1 2')]FORMAT_TO _TABLE('{first:04d} {last:02d}', :tv) => [('0001 02')] 

    格式

    使用给定的格式字符串和其他参数返回单个格式字符串。支持两种类型的附加参数:标量变量和单个数组。第一个参数类型仅接受标量变量,并且应具有正确的参数数量和类型。对于第二个参数类型,仅允许一个应具有正确大小和类型的数组。

    FORMAT_TO_TABLE/FORMAT_TO_ARRAY

    返回具有 N 格式字符串且使用给定表变量的表或数组。FORMAT STRING 逐行应用。

    示例代码DO BEGIN USING SQLSCRIPT_STRING AS LIB; DECLARE your_name STRING = LIB:FORMAT('{} {}', 'John', 'Sutherland'); --'John Sutherland' DECLARE name_age STRING = LIB:FORMAT('{1} {0}', 30, 'Sutherland'); --'Sutherland 30' DECLARE pi_str STRING = LIB:FORMAT('PI: {:06.2f}', 3.141592653589793); --'PI: 003.14'DECLARE ts STRING = LIB:FORMAT('Today is {}', TO_VARCHAR (current_timestamp, 'YYYY/MM/DD')); --'Today is 2017/10/18' DECLARE scores double ARRAY = ARRAY(1.4, 2.1, 40.3); DECLARE score_str STRING = LIB:FORMAT('{}-{}-{}', :scores); --'1.4-2.1-40.3'END; DO BEGIN USING SQLSCRIPT_STRING AS LIB; DECLARE arr NVARCHAR(5000) ARRAY; declare tv table(result NVARCHAR(5000)); --tt: [('John', 'Sutherland', 1988), ('Edward','Stark',1960)] DECLARE tt TABLE (first_name NVARCHAR(100), last_name NVARCHAR(100), birth_year INT); tt.first_name[1] = 'John'; tt.last_name[1] = 'Sutherland'; tt.birth_year[1] = 1988; tt.first_name[2] = 'Edward'; tt.last_name[2] = 'Stark'; tt.birth_year[2] = 1960; arr = LIB:FORMAT_TO_ARRAY('{first_name} {last_name} was born in {birth_year}', :tt); --['John Sutherland was born in 1988', 'Edward Stark was born in 1960'] tv = LIB:FORMAT_TO_TABLE('{first_name} {last_name} was born in {birth_year}', :tt); --tv: [('John Sutherland was born in 1988'), ('Edward Stark was born in 1960')]END;

    TABLE_SUMMARY

    TABLE_SUMMARY 将表变量转换为单个格式化字符串。它将表序列化为人性化格式,类似于客户端中的当前结果集。由于该表被序列化为单个字符串,因此结果是在 PROCEDURE 执行期间读取的,而不是在客户端获取时读取的。参数 MAX_RECORDS 限制要序列化的行数。如果格式化字符串的大小大于 NVARCHAR(8388607),则仅返回字符串的有限大小。

    通过 SQLScript FORMAT 函数,表中的值的格式如下:

  • 整数类型:使用 SQLScript FORMAT 字符串 "d" 进行格式化。

  • 字符串类型:使用 SQLScript FORMAT 字符串 "s" 进行格式化。

  • LOB 类型:使用 SQLScript FORMAT 字符串 ".32s"(最多 32 个字符)格式化

  • 浮点类型:使用 SQLScript FORMAT 字符串 ".2f"(2 位浮点值)格式化

  • 固定类型:使用 SQLScript FORMAT 字符串 "" 格式化(默认:保留原始精度 + 标度)

    示例代码CREATE TABLE SAMPLE1(NAME nvarchar(32), AGE INT);INSERT INTO SAMPLE1 VALUES ('John Bailey', 28);INSERT INTO SAMPLE1 VALUES ('Kevin Lawrence', 56);INSERT INTO SAMPLE1 VALUES ('Leonard Poole', 31);INSERT INTO SAMPLE1 VALUES ('Vanessa Avery', 16); DOBEGIN USING SQLSCRIPT_STRING AS STRING; USING SQLSCRIPT_PRINT AS PRINT; T1 = SELECT * FROM SAMPLE1; PRINT:PRINT_LINE(STRING:TABLE_SUMMARY(:T1, 3));END;------------------------NAME,AGEJohn Bailey,28Kevin Lawrence,56Leonard Poole,31