共用方式為


使用者定義的函式

大部分的資料庫都有 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 LIKE Y like(Y, X)
X LIKE Y ESCAPE Z like(Y, X, Z)
X MATCH Y match(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 偵錯體驗可協助您建立使用者定義的函式。

另請參閱