Как найти силу числа в 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