大部分的資料庫都有 SQL 的程式方言,可用來定義自己的函式。 不過,SQLite 會與您的應用程式進行同進程執行。 您不必學習 SQL 的新方言,而只需使用應用程式的程式設計語言即可。
純量函數
純量函式會針對查詢中的每個數據列傳回單一純量值。 使用CreateFunction定義新的純量函式,並覆寫內建函式。
state指定 自變數會將該值傳遞至函式的每個調用。 使用此選項可避免關閉。
指定 isDeterministic 函式是否具決定性,以允許 SQLite 在編譯查詢時使用其他優化。
下列範例示範如何新增純量函式來計算圓柱的半徑。
connection.CreateFunction(
"volume",
(double radius, double height)
=> Math.PI * Math.Pow(radius, 2) * height);
var command = connection.CreateCommand();
command.CommandText =
@"
SELECT name,
volume(radius, height) AS volume
FROM cylinder
ORDER BY volume DESC
";
運營商
下列 SQLite 運算符是由對應的純量函式實作。 在您的應用程式中定義這些純量函數將會覆蓋這些運算符的行為。
| 操作員 | 功能 |
|---|---|
| X GLOB Y | glob(Y,X) |
| X 像 Y | like(Y, X) |
| X LIKE Y ESCAPE Z | like(Y,X,Z) |
| X 比對 Y | 匹配(Y,X) |
| X REGEXP Y | regexp(Y, X) |
下列範例示範如何定義 regexp 函式,以啟用其對應的運算符。 SQLite 不包含 regexp 函式的預設實作。
connection.CreateFunction(
"regexp",
(string pattern, string input)
=> Regex.IsMatch(input, pattern));
var command = connection.CreateCommand();
command.CommandText =
@"
SELECT count()
FROM user
WHERE bio REGEXP '\w\. {2,}\w'
";
var count = command.ExecuteScalar();
聚合函數
聚合函數會傳回查詢中所有數據列的單一匯總值。 使用 CreateAggregate定義和覆寫聚合函數。
seed 參數指定上下文的初始狀態。 使用此方法以避免封閉。
每一列資料都會調用一次 func 參數。 使用上下文來累積最終結果。 傳回上下文。 此模式可讓內容成為實值型別或不可變。
resultSelector如果未指定 ,則會使用內容的最終狀態做為結果。 這可以簡化函式的定義,例如加總和計數,只需要遞增每個數據列的數字並傳回它。
指定 resultSelector 以在逐一查看所有數據列之後,計算內容的最終結果。
如需自變數的支持參數類型和func傳回類型的清單,請參閱resultSelector。
如果您的函式具決定性,請指定 isDeterministic 以允許 SQLite 在編譯查詢時使用其他優化。
下列範例會定義聚合函數來計算數據行的標準偏差。
connection.CreateAggregate(
"stdev",
// A tuple to maintain context between rows
(Count: 0, Sum: 0.0, SumOfSquares: 0.0),
// This is called for each row
((int Count, double Sum, double SumOfSquares) context, double value) =>
{
context.Count++;
context.Sum += value;
context.SumOfSquares += value * value;
return context;
},
// This is called to get the final result
context =>
{
var variance = context.SumOfSquares - context.Sum * context.Sum / context.Count;
return Math.Sqrt(variance / context.Count);
});
var command = connection.CreateCommand();
command.CommandText =
@"
SELECT stdev(gpa)
FROM student
";
var stdDev = command.ExecuteScalar();
錯誤
如果使用者定義函式擲回例外狀況,訊息會傳回 SQLite。 SQLite 接著會引發錯誤,Microsoft.Data.Sqlite 會擲回 SqliteException。 如需詳細資訊,請參閱 資料庫錯誤。
根據預設,SQLite 錯誤碼會SQLITE_ERROR (或 1)。 不過,您可以藉由在函式中插入 SqliteException,並指定所需的 SqliteErrorCode 來改變設定。
偵錯 / 除錯
SQLite 會直接呼叫您的實作。 這可讓您在 SQLite 評估查詢時新增觸發的斷點。 完整的 .NET 偵錯體驗可協助您建立使用者定義的函式。