小巧。快速。可靠。
三选二。
内置标量 SQL 函数

1. 概述

下面显示的核心函数默认可用。 日期和时间函数聚合函数窗口函数数学函数JSON 函数 在单独的文档中进行说明。应用程序可以使用 C 语言编写其他函数,并使用 sqlite3_create_function() API 将其添加到数据库引擎。

简单函数调用

simple-func ( expr ) , *

有关 SQL 函数调用如何在 SQL 表达式上下文中进行的更多信息,请参阅 表达式中的函数 文档。

2. 核心函数列表

3. 内置标量 SQL 函数的描述

abs(X)

abs(X) 函数返回数值参数 X 的绝对值。如果 X 为 NULL,则 Abs(X) 返回 NULL。如果 X 是无法转换为数值的字符串或 Blob,则 Abs(X) 返回 0.0。如果 X 是整数 -9223372036854775808,则 abs(X) 会抛出整数溢出错误,因为没有等效的正 64 位二进制补码值。

changes()

changes() 函数返回最近完成的 INSERT、DELETE 或 UPDATE 语句更改、插入或删除的数据库行数,不包括低级触发器中的语句。changes() SQL 函数是 sqlite3_changes64() C/C++ 函数的包装器,因此遵循相同的更改计数规则。

char(X1,X2,...,XN)

char(X1,X2,...,XN) 函数返回一个字符串,该字符串由分别具有整数 X1 到 XN 的 Unicode 代码点值的字符组成。

coalesce(X,Y,...)

coalesce() 函数返回其第一个非 NULL 参数的副本,如果所有参数都为 NULL,则返回 NULL。Coalesce() 必须至少有两个参数。

concat(X,...)

concat(...) 函数返回一个字符串,该字符串是其所有非 NULL 参数的字符串表示形式的串联。如果所有参数都为 NULL,则 concat() 返回空字符串。

concat_ws(SEP,X,...)

concat_ws(SEP,...) 函数返回一个字符串,该字符串是除第一个参数之外的所有非空参数的串联,使用第一个参数的文本值作为分隔符。如果第一个参数为 NULL,则 concat_ws() 返回 NULL。如果除第一个参数之外的所有参数都为 NULL,则 concat_ws() 返回空字符串。

format(FORMAT,...)

format(FORMAT,...) SQL 函数的工作原理类似于 sqlite3_mprintf() C 语言函数和标准 C 库中的 printf() 函数。第一个参数是格式字符串,它指定如何使用从后续参数获取的值来构造输出字符串。如果 FORMAT 参数缺失或为 NULL,则结果为 NULL。%n 格式被静默忽略,并且不使用参数。%p 格式是 %X 的别名。%z 格式可以与 %s 互换。如果参数列表中的参数太少,则假定缺少的参数具有 NULL 值,对于数字格式,这将转换为 0 或 0.0,对于 %s,则转换为空字符串。有关其他信息,请参阅 内置 printf() 文档。

glob(X,Y)

glob(X,Y) 函数等效于表达式“Y GLOB X”。请注意,在 glob() 函数中,相对于中缀 GLOB 运算符,X 和 Y 参数被反转了。Y 是字符串,X 是模式。因此,例如,以下表达式是等效的

     name GLOB '*helium*'
     glob('*helium*',name)
  

如果 sqlite3_create_function() 接口用于用备用实现覆盖 glob(X,Y) 函数,则 GLOB 运算符将调用备用实现。

hex(X)

hex() 函数将其参数解释为 BLOB,并返回一个字符串,该字符串是该 Blob 内容的大写十六进制表示形式。

如果“hex(X)”中的参数X是整数或浮点数,则“将其参数解释为 BLOB”意味着首先将二进制数转换为 UTF8 文本表示形式,然后将该文本解释为 BLOB。因此,“hex(12345678)”呈现为“3132333435363738”,而不是整数“0000000000BC614E”的二进制表示形式。

另请参阅:unhex()

ifnull(X,Y)

ifnull() 函数返回其第一个非 NULL 参数的副本,如果两个参数都为 NULL,则返回 NULL。Ifnull() 必须正好有两个参数。ifnull() 函数等效于具有两个参数的 coalesce()

iif(X,Y,Z)

如果 X 为真,则 iif(X,Y,Z) 函数返回 Y 值,否则返回 Z 值。iif(X,Y,Z) 函数在逻辑上等效于 字节码 生成的 CASE 表达式“CASE WHEN X THEN Y ELSE Z END”。

instr(X,Y)

instr(X,Y) 函数在字符串 X 中查找字符串 Y 的第一次出现,并返回之前字符数加 1,如果 Y 在 X 中未找到,则返回 0。或者,如果 X 和 Y 都是 Blob,则 instr(X,Y) 返回第一个出现位置之前的字节数加 1,如果 Y 在 X 中未找到,则返回 0。如果 instr(X,Y) 的两个参数 X 和 Y 都不是 NULL 且不是 Blob,则都解释为字符串。如果 instr(X,Y) 中的 X 或 Y 为 NULL,则结果为 NULL。

last_insert_rowid()

last_insert_rowid() 函数返回调用该函数的数据库连接的最后一行插入的 ROWID。last_insert_rowid() SQL 函数是 sqlite3_last_insert_rowid() C/C++ 接口函数的包装器。

length(X)

对于字符串值 X,length(X) 函数返回 X 中第一个 NULL 字符之前的字符数(而不是字节数)。由于 SQLite 字符串通常不包含 NULL 字符,因此 length(X) 函数通常会返回字符串 X 中字符的总数。对于 Blob 值 X,length(X) 返回 Blob 中的字节数。如果 X 为 NULL,则 length(X) 为 NULL。如果 X 为数值,则 length(X) 返回 X 的字符串表示形式的长度。

请注意,对于字符串,length(X) 函数返回字符串的字符长度,而不是字节长度。字符长度是字符串中字符的数量。对于 UTF-16 字符串,字符长度始终不同于字节长度,对于 UTF-8 字符串,如果字符串包含多字节字符,则字符长度可能不同于字节长度。使用 octet_length() 函数查找字符串的字节长度。

对于 BLOB 值,length(X) 始终返回 BLOB 的字节长度。

对于字符串值,length(X) 必须将整个字符串读入内存才能计算字符长度。但是对于 BLOB 值,则无需这样做,因为 SQLite 知道 BLOB 中有多少个字节。因此,对于多兆字节的值,length(X) 函数对于 BLOB 通常比对于字符串快得多,因为它不需要将值加载到内存中。

like(X,Y)
like(X,Y,Z)

like() 函数用于实现“Y LIKE X [ESCAPE Z]”表达式。如果存在可选的 ESCAPE 子句,则 like() 函数将使用三个参数调用。否则,它将仅使用两个参数调用。请注意,在 like() 函数中,相对于中缀 LIKE 运算符,X 和 Y 参数被反转了。X 是模式,Y 是要根据该模式匹配的字符串。因此,以下表达式是等效的

     name LIKE '%neon%'
     like('%neon%',name)
  

sqlite3_create_function() 接口可用于覆盖 like() 函数,从而更改 LIKE 运算符的操作。覆盖 like() 函数时,覆盖 like() 函数的两个参数和三个参数版本可能很重要。否则,根据是否指定了 ESCAPE 子句,可能会调用不同的代码来实现 LIKE 运算符。

likelihood(X,Y)

likelihood(X,Y) 函数返回参数 X 的不变值。likelihood(X,Y) 中的 Y 值必须是 0.0 到 1.0(含)之间的浮点数常量。likelihood(X) 函数是一个无操作函数,代码生成器会将其优化掉,以便在运行时(即,在调用 sqlite3_step() 时)不会消耗任何 CPU 周期。likelihood(X,Y) 函数的目的是向查询计划程序提供一个提示,即参数 X 是一个布尔值,其真概率约为 Y。unlikely(X) 函数是 likelihood(X,0.0625) 的简写。likely(X) 函数是 likelihood(X,0.9375) 的简写。

likely(X)

likely(X) 函数返回参数 X 的不变值。likely(X) 函数是一个无操作函数,代码生成器会将其优化掉,以便在运行时(即,在调用 sqlite3_step() 时)不会消耗任何 CPU 周期。likely(X) 函数的目的是向查询计划程序提供一个提示,即参数 X 是一个通常为真的布尔值。likely(X) 函数等效于 likelihood(X,0.9375)。另请参阅:unlikely(X)

load_extension(X)
load_extension(X,Y)

load_extension(X,Y) 函数使用入口点 Y 从名为 X 的共享库文件中加载 SQLite 扩展。load_extension() 的结果始终为 NULL。如果省略 Y,则使用默认入口点名称。如果扩展加载或初始化失败,则 load_extension() 函数会引发异常。

如果扩展尝试修改或删除 SQL 函数或排序规则,则 load_extension() 函数将失败。扩展可以添加新的函数或排序规则,但不能修改或删除现有的函数或排序规则,因为这些函数和/或排序规则可能在当前正在运行的 SQL 语句中的其他地方使用。要加载修改或删除函数或排序规则的扩展,请使用 sqlite3_load_extension() C 语言 API。

出于安全原因,扩展加载默认情况下处于禁用状态,必须通过先前调用 sqlite3_enable_load_extension() 来启用。

lower(X)

lower(X) 函数返回字符串 X 的副本,其中所有 ASCII 字符都转换为小写。默认的内置 lower() 函数仅适用于 ASCII 字符。要对非 ASCII 字符进行大小写转换,请加载 ICU 扩展。

ltrim(X)
ltrim(X,Y)

ltrim(X,Y) 函数返回一个字符串,该字符串通过从 X 的左侧删除出现在 Y 中的任何和所有字符形成。如果省略 Y 参数,则 ltrim(X) 会从 X 的左侧删除空格。

max(X,Y,...)

多参数 max() 函数返回具有最大值的参数,如果任何参数为 NULL,则返回 NULL。多参数 max() 函数从左到右搜索其参数,以查找定义排序函数的参数,并对所有字符串比较使用该排序函数。如果 max() 的任何参数都没有定义排序函数,则使用 BINARY 排序函数。请注意,max() 在具有 2 个或多个参数时是简单函数,但在仅给定一个参数时则作为 聚合函数 操作。

min(X,Y,...)

多参数 min() 函数返回具有最小值的参数。多参数 min() 函数从左到右搜索其参数,以查找定义排序函数的参数,并对所有字符串比较使用该排序函数。如果 min() 的任何参数都没有定义排序函数,则使用 BINARY 排序函数。请注意,min() 在具有 2 个或多个参数时是简单函数,但在仅给定一个参数时则作为 聚合函数 操作。

nullif(X,Y)

如果参数不同,则 nullif(X,Y) 函数返回其第一个参数;如果参数相同,则返回 NULL。nullif(X,Y) 函数从左到右搜索其参数,以查找定义排序函数的参数,并对所有字符串比较使用该排序函数。如果 nullif() 的任何参数都没有定义排序函数,则使用 BINARY 排序函数。

octet_length(X)

octet_length(X) 函数返回文本字符串 X 编码中的字节数。如果 X 为 NULL,则 octet_length(X) 返回 NULL。如果 X 是 BLOB 值,则 octet_length(X) 与 length(X) 相同。如果 X 是数值,则 octet_length(X) 返回该数字的文本呈现中的字节数。

因为 octet_length(X) 返回 X 中的字节数,而不是字符数,所以返回值取决于数据库编码。如果数据库编码为 UTF16 而不是 UTF8,则 octet_length() 函数可能会对相同的输入字符串返回不同的答案。

如果参数 X 是表列,并且值类型为文本或 blob,则 octet_length(X) 会避免从磁盘读取 X 的内容,因为字节长度可以从元数据计算得出。因此,即使 X 是包含多兆字节文本或 blob 值的列,octet_length(X) 效率也很高。

printf(FORMAT,...)

printf() SQL 函数是 format() SQL 函数 的别名。format() SQL 函数最初名为 printf()。但后来为了与其他数据库引擎兼容,名称更改为 format()。保留 printf() 名称作为别名,以避免破坏旧版代码。

quote(X)

quote(X) 函数返回 SQL 文字的文本,该文本是其参数的值,适合包含到 SQL 语句中。字符串用单引号括起来,并在内部引号处进行转义(如果需要)。BLOB 编码为十六进制文字。包含嵌入式 NUL 字符的字符串不能表示为 SQL 中的字符串文字,因此返回的字符串文字在第一个 NUL 之前被截断。

random()

random() 函数返回 -9223372036854775808 和 +9223372036854775807 之间的伪随机整数。

randomblob(N)

randomblob(N) 函数返回一个包含伪随机字节的 N 字节 blob。如果 N 小于 1,则返回 1 字节的随机 blob。

提示:应用程序可以使用此函数与 hex() 和/或 lower() 一起生成全局唯一标识符,如下所示

hex(randomblob(16))

lower(hex(randomblob(16)))

replace(X,Y,Z)

replace(X,Y,Z) 函数返回一个字符串,该字符串通过将字符串 Z 替换为字符串 X 中字符串 Y 的每次出现形成。使用 BINARY 排序顺序进行比较。如果 Y 为空字符串,则返回未更改的 X。如果 Z 最初不是字符串,则在处理之前将其转换为 UTF-8 字符串。

round(X)
round(X,Y)

round(X,Y) 函数返回一个浮点值 X,四舍五入到小数点右边 Y 位。如果省略或 Y 参数为负数,则将其视为 0。

rtrim(X)
rtrim(X,Y)

rtrim(X,Y) 函数返回一个字符串,该字符串通过从 X 的右侧删除出现在 Y 中的任何和所有字符形成。如果省略 Y 参数,则 rtrim(X) 会从 X 的右侧删除空格。

sign(X)

如果参数 X 是负数、零或正数的数值,则 sign(X) 函数分别返回 -1、0 或 +1。如果 sign(X) 的参数为 NULL 或字符串或 blob 无法无损转换为数字,则 sign(X) 返回 NULL。

soundex(X)

soundex(X) 函数返回一个字符串,该字符串是字符串 X 的 soundex 编码。如果参数为 NULL 或不包含 ASCII 字母字符,则返回字符串“?000”。默认情况下,SQLite 中省略了此函数。它仅在构建 SQLite 时使用 SQLITE_SOUNDEX 编译时选项时才可用。

sqlite_compileoption_get(N)

sqlite_compileoption_get() SQL 函数是 sqlite3_compileoption_get() C/C++ 函数的包装器。此例程返回用于构建 SQLite 的第 N 个编译时选项,如果 N 超出范围,则返回 NULL。另请参阅 compile_options pragma

sqlite_compileoption_used(X)

sqlite_compileoption_used() SQL 函数是 sqlite3_compileoption_used() C/C++ 函数的包装器。当 sqlite_compileoption_used(X) 的参数 X 是一个字符串时,该字符串是编译时选项的名称,此例程会根据构建期间是否使用了该选项返回 true (1) 或 false (0)。

sqlite_offset(X)

sqlite_offset(X) 函数返回数据库文件中将读取值记录的开头的字节偏移量。如果 X 不是普通表中的列,则 sqlite_offset(X) 返回 NULL。sqlite_offset(X) 返回的值可能引用原始表或索引,具体取决于查询。如果值 X 通常是从索引中提取的,则 sqlite_offset(X) 返回对应索引记录的偏移量。如果值 X 将从原始表中提取,则 sqlite_offset(X) 返回表记录的偏移量。

sqlite_offset(X) SQL 函数仅在使用 -DSQLITE_ENABLE_OFFSET_SQL_FUNC 编译时选项构建 SQLite 时才可用。

sqlite_source_id()

sqlite_source_id() 函数返回一个字符串,该字符串标识用于构建 SQLite 库的源代码的特定版本。sqlite_source_id() 返回的字符串是源代码签入的日期和时间,后跟该签入的 SHA3-256 哈希值。此函数是 sqlite3_sourceid() C 接口的 SQL 包装器。

sqlite_version()

sqlite_version() 函数返回正在运行的 SQLite 库的版本字符串。此函数是 sqlite3_libversion() C 接口的 SQL 包装器。

substr(X,Y,Z)
substr(X,Y)
substring(X,Y,Z)
substring(X,Y)

substr(X,Y,Z) 函数返回输入字符串 X 的子字符串,该子字符串以第 Y 个字符开头,长度为 Z 个字符。如果省略 Z,则 substr(X,Y) 返回从第 Y 个字符开始到字符串 X 末尾的所有字符。X 的最左侧字符为数字 1。如果 Y 为负数,则子字符串的第一个字符是通过从右侧而不是左侧计数找到的。如果 Z 为负数,则返回第 Y 个字符之前的 abs(Z) 个字符。如果 X 是字符串,则字符索引指的是实际的 UTF-8 字符。如果 X 是 BLOB,则索引指的是字节。

从 SQLite 版本 3.34 开始,“substring()”是“substr()”的别名。

total_changes()

total_changes() 函数返回自当前数据库连接打开以来由 INSERT、UPDATE 或 DELETE 语句导致的行更改数。此函数是 sqlite3_total_changes64() C/C++ 接口的包装器。

trim(X)
trim(X,Y)

trim(X,Y) 函数返回一个字符串,该字符串通过从 X 的两端删除出现在 Y 中的任何和所有字符形成。如果省略 Y 参数,则 trim(X) 会从 X 的两端删除空格。

typeof(X)

typeof(X) 函数返回一个字符串,该字符串指示表达式 X 的 数据类型:“null”、“integer”、“real”、“text”或“blob”。

unhex(X)
unhex(X,Y)

unhex(X,Y) 函数返回一个 BLOB 值,该值是十六进制字符串 X 的解码结果。如果 X 包含任何不是十六进制数字且不在 Y 中的字符,则 unhex(X,Y) 返回 NULL。如果省略 Y,则将其理解为空字符串,因此 X 必须是纯十六进制字符串。X 中的所有十六进制数字必须成对出现,并且每对的两个数字都必须彼此紧邻开始,否则 unhex(X,Y) 返回 NULL。如果参数 X 或 Y 为 NULL,则 unhex(X,Y) 返回 NULL。X 输入可以包含任意混合的大小写十六进制数字。Y 中的十六进制数字对 X 的转换没有影响。仅 Y 中不是十六进制数字的字符在 X 中被忽略。

另请参阅:hex()

unicode(X)

unicode(X) 函数返回对应于字符串 X 的第一个字符的数字 Unicode 代码点。如果 unicode(X) 的参数不是字符串,则结果未定义。

unlikely(X)

unlikely(X) 函数返回未更改的参数 X。unlikely(X) 函数是一个无操作函数,代码生成器会将其优化掉,因此它在运行时(即在调用 sqlite3_step() 时)不会消耗任何 CPU 周期。unlikely(X) 函数的目的是向查询计划程序提供一个提示,指示参数 X 是一个布尔值,该值通常不为真。unlikely(X) 函数等效于 likelihood(X, 0.0625)。

upper(X)

upper(X) 函数返回输入字符串 X 的副本,其中所有小写 ASCII 字符都转换为其大写等效项。

zeroblob(N)

zeroblob(N) 函数返回一个由 N 个 0x00 字节组成的 BLOB。SQLite 对这些 zeroblob 进行非常有效的管理。Zeroblob 可用于为稍后使用 增量 BLOB I/O 编写的 BLOB 预留空间。此 SQL 函数使用 C/C++ 接口中的 sqlite3_result_zeroblob() 例程实现。

此页面上次修改于 2023-12-05 14:43:20 UTC