Как найти силу числа в SQLite

Я хочу обновить поле Interest в моей базе данных. Мой SQL-запрос похож на ниже

Update Table_Name set Interest = Principal * Power ((1 + (rate/ 100), год)

Этот запрос отлично работает в MySQL, но не работает с SQLite.

Ошибка говорит о том, что Функция No Power funcation найдена

Кто-нибудь знает, как решить эту проблему, поскольку я должен сделать это с помощью запроса, поскольку мне нужно обновлять более 3000 записей за раз.

Ответ 1

SQLite не имеет много доступных функций. Но хорошая новость в том, что достаточно легко добавить свои собственные.

Вот как это сделать, используя C API (который также работает из кода Objective-C).

Сначала напишите степенную функцию:

void sqlite_power(sqlite3_context *context, int argc, sqlite3_value **argv) {
    double num = sqlite3_value_double(argv[0]); // get the first arg to the function
    double exp = sqlite3_value_double(argv[1]); // get the second arg
    double res = pow(num, exp);                 // calculate the result
    sqlite3_result_double(context, res);        // save the result
}

Затем вам нужно зарегистрировать функцию:

int res = sqlite3_create_function(dbRef, "POWER", 2, SQLITE_UTF8, NULL, &sqlite_power, NULL, NULL);

2 - количество аргументов для функции. dbRef - это ссылка на базу данных sqlite3 *.

Ответ 2

Если вы используете пакет SQLite NuGet в .NET-проекте, вы можете написать метод расширения и связать его во время выполнения;

[SQLiteFunction("pow", 2, FunctionType.Scalar)]
public class SQLitePowerExtension : SQLiteFunction
{
    public override object Invoke(object[] args)
    {
        double num = (double)args[0];
        double exp = (double)args[1];

        return Math.Pow(num, exp);
    }
}

И затем используйте его так:

using (var conn = new SQLiteConnection("Data Source=:memory:"))
{
    conn.Open();
    conn.BindFunction(typeof(SQLitePowerExtension).GetCustomAttribute<SQLiteFunctionAttribute>(), new SQLitePowerExtension());

    var comm = new SQLiteCommand("CREATE TABLE test (num REAL, exp REAL, result REAL)", conn);
    comm.ExecuteNonQuery();

    // Populate with some data - not shown

    comm = new SQLiteCommand($"UPDATE test SET result = pow(num, exp))", conn);
    comm.ExecuteNonQuery();
}

Ответ 3

SQLite не предоставляет функцию мощности или оператора. Вам придется реализовать его самостоятельно через sqlite3_create_function….

Ответ 4

http://richkidsondrugs.tumblr.com/post/165870389/upgrading-sqlite-to-support-math-functions-on-cocoa

Шаг должен был построить библиотеку расширений Math, которую замечательный человек по имени Лиам Хили написал:

Введите следующую команду в терминал:

Шаг 1) Загрузить/Открыть ссылку http://sqlite.org/contrib/download/extension-functions.c?get=25

Шаг 2) Перейдите в папку, где загружается функция extension-functions.c. Команда запуска "gcc -fno-common -dynamiclib extension-functions.c -o libsqlitefunctions.dylib". Это создаст файл libsqlitefunctions.dylib в том же месте, тогда вы можете использовать его в своем приложении ios из xcode.

Теперь в вашем приложении cocoa вы можете добавить:

"SELECT load_extension(’libsqlitefunctions.dylib’);"

а затем у вас есть доступ ко всем видам славных методов, таких как COS, SQRT и т.д.! Вы можете использовать их в своем приложении следующим образом:

//Activate database loading
sqlite3_enable_load_extension(database, 1);
sqlite3_load_extension(database,"libsqlitefunctions.dylib",0,0);

Ответ 5

Пробуйте эту ссылку:

http://www.sqlite.org/contrib

Проверьте файл extension-functions.c. Попробуйте использовать его в XCode.

Надеюсь, что это поможет

Ответ 6

Вы также можете создать пользовательскую функцию SQLite из Python. На основании примера на docs.python.org: sqlite3.Connection.create_function

Создайте функцию Python:

def sqlite_power(x,n):
    return int(x)**n
print(sqlite_power(2,3))
# 8    

Создайте пользовательскую функцию SQLite на основе функции python:

con = sqlite3.connect(":memory:")
con.create_function("power", 2, sqlite_power)

Используй это:

cur = con.cursor()
cur.execute("select power(?,?)", (2,3))
print cur.fetchone()[0]
# 8