共用方式為


用戶定義函式

大部分的資料庫都有 SQL 的程式方言,可用來定義自己的函式。 不過,SQLite 會與您的應用程式進行同進程執行。 您不必學習 SQL 的新方言,而只需使用應用程式的程式設計語言即可。

純量函數

純量函式會針對查詢中的每個數據列傳回單一純量值。 使用CreateFunction定義新的純量函式,並覆寫內建函式。

如需支持的參數清單和自變數的傳回型別,請參閱func

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 偵錯體驗可協助您建立使用者定義的函式。

另請參閱