SQLite05-常用函数

文章目录

SQLite05-常用函数

1、数学函数

(1)abs(X)
  • 功能:返回参数 X 的绝对值。
  • 规则:
    • 如果 X 为 NULL,返回 NULL。
    • 如果 X 是字符串或 BLOB 且无法转换为数字,返回 0.0。
    • 如果 X 是整数 -9223372036854775808,会触发整数溢出错误(因为无对应的正 64 位值)。
  • 示例:
sql 复制代码
SELECT abs(-10); -- 返回 10 
SELECT abs('invalid'); -- 返回 0.0 
(2)round(X, Y)
  • 功能:将浮点值 X 四舍五入到小数点后 Y 位。
  • 规则:Y 可选;如果省略或为负数,默认为 0(即取整)。
  • 示例:
sql 复制代码
SELECT round(3.14159, 2); -- 返回 3.14 
SELECT round(3.14159);    -- 返回 3.0 
(3)sign(X)
  • 功能:返回参数 X 的符号:-1(负)、0(零)或 +1(正)。
  • 规则:如果 X 为 NULL 或无法转换为数字,返回 NULL。
  • 示例:
sql 复制代码
SELECT sign(-5);      -- 返回 -1
SELECT sign('text'); -- 返回 NULL

2、字符串函数

(1)char(X1, X2, ..., XN)
  • 功能:返回一个字符串,由 Unicode 码点值 X1 到 XN 对应的字符组成。
  • 规则:每个 Xi 是整数,表示 Unicode 码点。
  • 示例:
sql 复制代码
SELECT char(72, 101, 108, 108, 111); -- 返回 'Hello'(码点对应 ASCII)
(2)concat(X, ...)
  • 功能:返回所有非 NULL 参数的字符串表示的拼接。
  • 规则:所有参数为 NULL 时,返回空字符串。
  • 示例:
sql 复制代码
SELECT concat('SQL', 'ite'); -- 返回 'SQLite'
SELECT concat(NULL, 'text'); -- 返回 'text'
(3)concat_ws(SEP, X, ...)
  • 功能:使用分隔符 SEP 拼接所有非 NULL 参数(除第一个 SEP 外)。
  • 规则:
    • 如果 SEP 为 NULL,返回 NULL。
    • 所有其他参数为 NULL 时,返回空字符串。
  • 示例:
sql 复制代码
SELECT concat_ws('-', '2023', '01', '01'); -- 返回 '2023-01-01'
(4)format(FORMAT, ...) / printf(FORMAT, ...)
  • 功能:类似 C 语言的 printf,使用格式字符串构造输出(printf 是 format 的别名)。
  • 规则:
    • FORMAT 参数缺失或 NULL 时,返回 NULL。
    • 支持 %s、%X 等格式;%n 被忽略,%p 是 %X 的别名。
    • 参数不足时,缺失部分视为 NULL(数字格式为 0,%s 为空字符串)。
  • 示例:
sql 复制代码
SELECT format('Name: %s, Age: %d', 'Alice', 30); -- 返回 'Name: Alice, Age: 30'
(5)lower(X)
复制代码
- 功能:返回字符串 X 的所有 ASCII 字符转换为小写的副本。  
- 规则:仅支持 ASCII;非 ASCII 字符需加载 ICU 扩展。
- 示例:
sql 复制代码
SELECT lower('SQLite'); -- 返回 'sqlite'
(6)substr(X, Y, Z) / substring(X, Y, Z)
  • 功能:返回 X 的子串,从第 Y 个字符开始,长度为 Z(Z 可省略)。
  • 规则:
    • Y 为负数时从右向左计数;Z 为负数时返回 Y 前的字符。
    • X 为字符串时基于 UTF-8 字符;为 BLOB 时基于字节。
  • 示例:
sql 复制代码
SELECT substr('SQLite', 2, 3); -- 返回 'QLi'
SELECT substring('SQLite', -4); -- 返回 'Lite'(Y 为负)
(7)instr(X, Y)
  • 功能:返回字符串 Y 在 X 中首次出现的位置(位置从 1 开始)。
  • 规则:
    • 如果 X 或 Y 为 NULL,返回 NULL;找不到时返回 0。
    • 适用于 BLOB(字节位置)。
  • 示例:
sql 复制代码
SELECT instr('SQLite', 'Li'); -- 返回 3 
(8)replace(X, Y, Z)
  • 功能:返回字符串 X 中所有出现的 Y 替换为 Z 后的结果。
  • 规则:使用 BINARY 校对序列进行比较;Y 为空时返回 X。
  • 示例:
sql 复制代码
SELECT replace('Hello World', 'World', 'SQLite'); -- 返回 'Hello SQLite'
(9)length(X)
  • 功能:返回字符串 X 的 Unicode 字符数或 BLOB 的字节数。
  • 规则:
    • X 为 NULL 时返回 NULL;字符串计算字符数(非字节)。
    • 字符串包含 U+0000 时仅计到该字符前。
  • 示例:
sql 复制代码
SELECT length('SQLite'); -- 返回 6(字符数)
(10)octet_length(X)
  • 功能:返回文本字符串 X 的编码字节数(BLOB 时同 length)。
  • 规则:
    • 结果依赖于数据库编码(UTF-8 或 UTF-16)。
    • 高效处理大文本/ BLOB(避免读取磁盘)。
  • 示例:
sql 复制代码
SELECT octet_length('SQLite'); -- 返回 6(UTF-8 编码)
(11)trim(X, Y) / ltrim(X, Y) / rtrim(X, Y)
  • 功能:移除 X 两端(或左/右)在 Y 中出现的字符;Y 省略时默认为空格。
  • 规则:Y 是字符集;省略时去空格。
  • 示例:
sql 复制代码
SELECT trim('  SQLite  ');      -- 返回 'SQLite'
SELECT ltrim('xxSQLite', 'x'); -- 返回 'SQLite'
(12)soundex(X)
  • 功能:返回字符串 X 的 Soundex 编码(需编译时启用 SQLITE_SOUNDEX)。
  • 规则:X 为 NULL 或不含 ASCII 字母时返回 '?000'。
  • 示例:
sql 复制代码
SELECT soundex('Smith'); -- 返回 'S530'

3、逻辑函数

(1)coalesce(X, Y, ...)
  • 功能:返回第一个非 NULL 参数的副本;所有为 NULL 时返回 NULL。
  • 规则:至少需两个参数。
  • 示例:
sql 复制代码
SELECT coalesce(NULL, 'default'); -- 返回 'default'
(2)ifnull(X, Y)
  • 功能:两参数版本,等同于 coalesce(X, Y)。
  • 规则:必须有两个参数。
  • 示例:
sql 复制代码
SELECT ifnull(NULL, 'backup'); -- 返回 'backup'
(3)iif(B1, V1, ...) / if(B1, V1, ...)
  • 功能:基于布尔条件返回值;参数成对出现(布尔 + 值)。
  • 规则:
    • 返回第一个真布尔对应的值;所有假时,参数为奇数返回最后一个值,偶数返回 NULL。
    • 支持短路评估(仅计算必要的参数)。
    • 至少需两个参数。
  • 示例:
sql 复制代码
SELECT iif(1 > 2, 'No', 'Yes'); -- 返回 'Yes'
SELECT if(0, 'False', 'Default'); -- 返回 'Default'(等价 iif)
(4)nullif(X, Y)
  • 功能:参数不同时返回 X,相同时返回 NULL。
  • 规则:使用 BINARY 校对序列比较字符串。
  • 示例:
sql 复制代码
SELECT nullif('A', 'B'); -- 返回 'A'
SELECT nullif('A', 'A'); -- 返回 NULL
(5)likelihood(X, Y)
  • 功能:返回 X 不变,提供查询计划提示(概率 Y)。
  • 规则:
    • Y 必须是 0.0 到 1.0 的浮点常量;运行时优化掉(无 CPU 消耗)。
    • likely(X) 是 likelihood(X, 0.9375) 的简写;unlikely(X) 是 likelihood(X, 0.0625)(参考文本隐含)。
  • 示例:
sql 复制代码
SELECT likelihood(column > 0, 0.9); -- 提示 column 大概率大于 0 
(6)likely(X) / unlikely(X)
  • 功能:返回 X 不变,提供查询计划提示(通常真或假)。
  • 规则:运行时优化掉;likely(X) 等同于 likelihood(X, 0.9375)。
  • 示例:
sql 复制代码
SELECT likely(column = 1); -- 提示条件通常为真

4、系统信息函数

(1)changes()
  • 功能:返回最近 INSERT/DELETE/UPDATE 更改的行数(不包括低级触发器)。
  • 规则:包装 sqlite3_changes64() C 函数。
  • 示例:
sql 复制代码
INSERT INTO table VALUES (...); SELECT changes(); -- 返回插入的行数 
(2)last_insert_rowid()
  • 功能:返回当前连接最后插入行的 ROWID。
  • 规则:包装 sqlite3_last_insert_rowid() C 函数。
  • 示例:
sql 复制代码
INSERT INTO table (...) VALUES (...); SELECT last_insert_rowid(); -- 返回新行 ROWID 
(3)total_changes()
  • 功能:返回当前连接打开以来所有行更改总数。
  • 规则:包装 sqlite3_total_changes64() C 函数。
  • 示例:
sql 复制代码
SELECT total_changes(); -- 返回总计更改行数
(4)sqlite_version()
  • 功能:返回 SQLite 库的版本字符串。
  • 规则:包装 sqlite3_libversion() C 函数。
  • 示例:
sql 复制代码
SELECT sqlite_version(); -- 如 '3.45.0'
(5)sqlite_source_id()
  • 功能:返回 SQLite 源代码的版本标识(日期 + SHA3-256 哈希)。
  • 规则:包装 sqlite3_sourceid() C 函数。
  • 示例:
sql 复制代码
SELECT sqlite_source_id(); -- 如 '2025-01-14 abcdef...'
(6)sqlite_compileoption_get(N)
  • 功能:返回第 N 个编译时选项;N 超范围时返回 NULL。
  • 规则:包装 sqlite3_compileoption_get() C 函数。
  • 示例:
sql 复制代码
SELECT sqlite_compileoption_get(0); -- 返回第一个编译选项
(7)sqlite_compileoption_used(X)
  • 功能:检查编译时选项 X 是否被使用(返回 1 或 0)。
  • 规则:X 是选项名称字符串。
  • 示例:
sql 复制代码
SELECT sqlite_compileoption_used('ENABLE_JSON'); -- 返回 1 或 0
(8)sqlite_offset(X)
  • 功能:返回值 X 在数据库文件中的字节偏移(需编译时启用)。
  • 规则:
    • X 不是普通表列时返回 NULL。
    • 根据查询引用表或索引。
  • 示例:
sql 复制代码
SELECT sqlite_offset(column) FROM table; -- 返回偏移量

5、数据类型处理函数

(1)hex(X)
  • 功能:将 BLOB 或数字 X 编码为大写十六进制字符串。
  • 规则:数字先转换为 UTF-8 文本,再作为 BLOB 编码。
  • 示例:
sql 复制代码
SELECT hex('SQLite'); -- 返回 '53514C697465'
(2)unhex(X, Y)
  • 功能:将十六进制字符串 X 解码为 BLOB;Y 是允许的非十六进制字符集。
  • 规则:X 包含非法字符(不在 Y 中)时返回 NULL;Y 省略时默认为空字符串。
  • 示例:
sql 复制代码
SELECT unhex('53514C697465'); -- 返回 BLOB 'SQLite'
(3)quote(X)
  • 功能:返回 X 的 SQL 字面量形式(字符串加引号,BLOB 转为十六进制)。
  • 规则:
    • 字符串转义内部引号;BLOB 转十六进制。
    • 遇 NUL 字符时截断。
  • 示例:
sql 复制代码
SELECT quote('text'); -- 返回 '''text'''
(4)typeof(X)
  • 功能:返回 X 的数据类型字符串("null"、"integer"、"real"、"text" 或 "blob")。
  • 规则:直接报告表达式类型。
  • 示例:
sql 复制代码
SELECT typeof(123); -- 返回 'integer'
(5)cast(X AS type)
  • 功能:强制将表达式 expr 转换为目标数据类型 type
  • 支持类型:INTEGERREALTEXTBLOBNUMERIC
  • 示例:
sql 复制代码
SELECT CAST('123.45' AS INTEGER);  -- 结果: 123(截断小数)
SELECT CAST('2025-07-11' AS TEXT); -- 保留文本格式 
  • 注意:
    • 转换失败时返回 NULL(如 CAST('abc' AS INTEGER))。
    • 浮点转整数会截断小数部分(非四舍五入)。
  • BLOB 转换
    • 文本转 BLOB:
sql 复制代码
SELECT CAST('binary_data' AS BLOB); -- 文本编码为二进制 
复制代码
- BLOB 转文本:需确保二进制数据是合法编码(如 UTF-8)。
(6)json_extract(X,Y)
  • 需启用 JSON1 扩展(SQLite 3.9.0+ 默认支持)
sql 复制代码
-- JSON字符串转结构化数据
SELECT json_extract('{"name": "Alice", "age": 30}', '$.age'); 
-- 结果: 30 (REAL类型)
(7)隐式转换规则
  • SQLite 在运算中自动按以下优先级转换类型:
plain 复制代码
NULL → INTEGER → REAL → TEXT → BLOB 
  • 示例:
sql 复制代码
SELECT 1 + '2.5';        -- 整数1转为REAL,结果: 3.5 
SELECT 'Price: ' || 100; -- 整数100转为TEXT,结果: 'Price: 100'
  • 风险:隐式转换可能导致意外截断(如 '123abc' 转整数得 123)。
(8)转换注意事项
场景 建议方案 风险
浮点转整数 先用 ROUND() 四舍五入 直接 CAST 会截断小数
非数字文本转数值 先用 REGEXP 过滤非法字符 否则得 NULL
大整数转 REAL 避免超 2^53 范围(精度丢失) 金融计算建议用 TEXT 存储
时区转换 结合 datetime()localtime 修饰符 文本日期需严格格式
(9)最佳实践总结
  • 显式优于隐式:关键计算优先用 CAST 明确类型。
  • 校验数据类型:插入数据前用 TYPEOF() 检查格式。
  • 避免混合运算:如整数与文本比较前手动统一类型。
  • 复杂转换分步处理:
sql 复制代码
-- 安全转换文本到整数
SELECT CASE WHEN '123' GLOB '*[^0-9]*' THEN NULL 
            ELSE CAST('123' AS INTEGER) END;

6、随机生成函数

(1)random()
  • 功能:返回伪随机整数(范围:-9223372036854775808 到 +9223372036854775807)。
  • 规则:无参数。
  • 示例:
sql 复制代码
SELECT random(); -- 返回随机整数 
(2)randomblob(N)
  • 功能:返回 N 字节的伪随机 BLOB;N < 1 时返回 1 字节。
  • 规则:常用于生成唯一标识(结合 hex 或 lower)。
  • 示例:
sql 复制代码
SELECT hex(randomblob(16)); -- 返回 32 字符十六进制字符串 

7、模式匹配函数

(1)glob(X, Y)
  • 功能:等效于 "Y GLOB X",检查 Y 是否匹配模式 X。
  • 规则:
    • 参数顺序与中缀运算符相反(X 是模式,Y 是字符串)。
    • 可被 sqlite3_create_function() 覆盖。
  • 示例:
sql 复制代码
SELECT glob('*helium*', name); -- 等同于 name GLOB '*helium*'
(2)like(X, Y) / like(X, Y, Z)
  • 功能:等效于 "Y LIKE X [ESCAPE Z]",检查 Y 是否匹配模式 X(支持转义)。
  • 规则:
    • 参数顺序与中缀运算符相反(X 是模式,Y 是字符串)。
    • Z 是转义字符(可选);可被自定义覆盖。
  • 示例:
sql 复制代码
SELECT like('%neon%', name); -- 等同于 name LIKE '%neon%'

8、日期时间函数

(1)date(timestring, modifier...)
  • 功能:返回 YYYY-MM-DD 格式的日期
  • 示例:
sql 复制代码
SELECT date('now'); -- 当前日期 → "2025-07-10"
SELECT date('2025-12-31', '+3 months'); -- 加3个月 → "2026-03-31"
-- 本月最后一天 
SELECT date('now', 'start of month', '+1 month', '-1 day');
-- 本周一日期 
SELECT date('now', 'weekday 1');
-- 查询今日数据 
SELECT * FROM logs WHERE date(create_time) = date('now');
  • 用于动态调整时间值
修饰符 作用 示例
start of year 重置到年初 date('now', 'start of year') → "2025-01-01"
start of month 重置到月初 date('now', 'start of month') → "2025-07-01"
+/- N days 加减天数 date('now', '+7 days') → 7天后
+/- N hours 加减小时 time('now', '-3 hours') → 3小时前
localtime 转换到本地时区 datetime('now', 'localtime')
utc 转换到 UTC 时区 datetime('now', 'utc')
unixepoch 解析 Unix 时间戳 datetime(1750000000, 'unixepoch') → "2025-07-10 00:00:00"
(2)time(timestring, modifier...)
  • 功能:返回 HH:MM:SS 格式的时间
  • 示例:
sql 复制代码
SELECT time('now'); -- 当前时间 → "17:15:30"
SELECT time('14:30', '+90 minutes'); -- 加90分钟 → "16:00"
(3)datetime(timestring, modifier...)
  • 功能:返回 YYYY-MM-DD HH:MM:SS 格式的完整时间
  • 示例:
sql 复制代码
SELECT datetime('now', 'localtime'); -- 本地时间 → "2025-07-11 01:15:30" (UTC+8)
(4)strftime(format, timestring, modifier...)
  • 功能:自定义格式化输出时间(最灵活的函数)
  • 常用格式符:
符号 含义 示例输出
%Y 四位年份 "2025"
%m 月份 (01-12) "07"
%d 日 (01-31) "10"
%H 小时 (00-23) "17"
%M 分钟 (00-59) "30"
%S 秒 (00-59) "45"
%f 毫秒 (SS.SSS) "123"
%s Unix 时间戳 "1750000000"
  • 示例:
sql 复制代码
SELECT strftime('%Y年%m月%d日 %H:%M', 'now'); -- → "2025年07月10日 17:15"
-- Unix 时间戳转可读格式 
SELECT strftime('%Y-%m-%d %H:%M:%S', 1750000000, 'unixepoch');
(5)julianday(timestring, modifier...)
  • 功能:返回儒略日(公元前4714年11月24日格林威治中午起算的天数)
  • 示例:
sql 复制代码
SELECT julianday('2025-01-01'); -- → 2460484.5 
-- 计算年龄(精确到天)
SELECT julianday('now') - julianday('2000-01-01'); 
相关推荐
李宥小哥2 小时前
SQLite04-表数据管理
java·jvm·数据库
huohuopro2 小时前
idea配置servlet项目
java·servlet·intellij-idea
皮卡狮2 小时前
C++面向对象编程的三大核心特性之一:多态
开发语言·c++
zzb15802 小时前
Agent学习-ReAct框架
java·人工智能·python·机器学习·ai
zhangx1234_2 小时前
java list介绍
java·开发语言·list
Java面试题总结2 小时前
Go运行时系统解析: runtime包深度指南
开发语言·后端·golang
识君啊2 小时前
拆分与合并的艺术·分治思想:Java归并排序深度解析
java·数据结构·算法·排序算法·归并排序·分治
左左右右左右摇晃2 小时前
Java Object 类笔记
java·笔记
lly2024062 小时前
jEasyUI 树形菜单加载父/子节点详解
开发语言