預設提供以下核心函數。 日期和時間函數、聚合函數、視窗函數、數學函數 和 JSON 函數 分別有獨立文件說明。應用程式可以定義額外的函數,使用 sqlite3_create_function() API 以 C 語言撰寫並新增至資料庫引擎。
有關 SQL 函數呼叫如何符合 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() 至少要有 2 個引數。
concat(X,...)
concat(...) 函數傳回一個字串,為其所有非 NULL 引數的字串表示的串接。如果所有引數都為 NULL,concat() 傳回一個空字串。
concat_ws(SEP,X,...)
concat_ws(SEP,...) 函數傳回一個字串,為第一個引數之後的所有非 NULL 引數的串接,使用第一個引數的文字值作為分隔符號。如果第一個引數為 NULL,concat_ws() 傳回 NULL。如果除了第一個引數之外的所有引數都為 NULL,concat_ws() 傳回一個空字串。
format(格式,...)
format(FORMAT,...) SQL 函數運作方式類似於 C 語言函數 sqlite3_mprintf() 和標準 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() 函數中的 X 和 Y 引數與中綴 GLOB 運算子相反。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)
iif(X,Y,Z) 函數會在 X 為真時傳回 Y 值,否則傳回 Z 值。iif(X,Y,Z) 函數在邏輯上等同於 CASE 表達式「CASE WHEN X THEN Y ELSE Z END」,且會產生相同的 位元組碼。
instr(X,Y)
instr(X,Y) 函數會在字串 X 中尋找字串 Y 的第一次出現,並傳回先前的字元數加 1,或是在 X 中找不到 Y 時傳回 0。或者,如果 X 和 Y 都是 BLOB,則 instr(X,Y) 會傳回在 Y 第一次出現之前的位元組數加 1,或是在 X 中找不到 Y 時傳回 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 中在第一個 NUL 字元之前的字元數(非位元組數)。由於 SQLite 字串通常不包含 NUL 字元,因此 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() 函數中,X 和 Y 參數與中綴 LIKE 運算子相反。X 是模式,而 Y 是要與該模式比對的字串。因此,下列表達式是等效的
name LIKE '%neon%' like('%neon%',name)
可以使用 sqlite3_create_function() 介面覆寫 like() 函數,並因此變更 LIKE 運算子的操作。覆寫 like() 函數時,覆寫 like() 函數的兩個和三個引數版本可能很重要。否則,可能會呼叫不同的程式碼來實作 LIKE 運算子,具體取決於是否指定了 ESCAPE 子句。
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) 函數從名為 X 的共用函式庫檔案中載入 SQLite 擴充功能,並使用進入點 Y。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) 函數傳回一個字串,其為字串 X 中每個出現的字串 Y 替換為字串 Z 所形成。比較時使用 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)
sign(X) 函數傳回 -1、0 或 +1,分別表示參數 X 是負值、零或正值。如果 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 函數只有在 SQLite 使用 -DSQLITE_ENABLE_OFFSET_SQL_FUNC 編譯時期選項建置時才會提供。
sqlite_source_id()
sqlite_source_id() 函數會傳回一個字串,用來識別建置 SQLite 函式庫時所使用的特定原始碼版本。sqlite_source_id() 傳回的字串是原始碼簽入的日期和時間,後面接著該簽入的 SHA3-256 hash。此函數是 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,則索引會參考位元組。
「substring()」是從 SQLite 版本 3.34 開始用來取代「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 中僅會忽略不是十六進位數字的字元。
另請參閱:hex()
unicode(X)
unicode(X) 函式會傳回對應於字串 X 第一個字元的數字 unicode 編碼點。如果 unicode(X) 的參數不是字串,則結果未定義。
unlikely(X)
unlikely(X) 函數會傳回未變更的參數 X。unlikely(X) 函數是一個無操作函數,程式碼產生器會將其最佳化,以便在執行階段(也就是在呼叫 sqlite3_step() 時)不消耗任何 CPU 週期。unlikely(X) 函數的目的是提供一個提示給查詢規劃器,表示參數 X 是通常為 false 的布林值。unlikely(X) 函數等同於 likelihood(X, 0.0625)。
upper(X)
upper(X) 函數會傳回輸入字串 X 的一份拷貝,其中所有小寫 ASCII 字元都轉換成對應的大寫字元。
zeroblob(N)
zeroblob(N) 函數會傳回一個由 N 個 0x00 組成的 BLOB。SQLite 會非常有效率地管理這些 zeroblob。Zeroblob 可用來保留 BLOB 的空間,之後再使用 增量 BLOB I/O 寫入。這個 SQL 函數是使用 C/C++ 介面的 sqlite3_result_zeroblob() 常式實作的。
此頁面最後修改於 2023-12-05 14:43:20 UTC