我想更新数据库中的兴趣字段。我的SQL查询如下所示
更新Table_Name set Interest = Principal * Power((1 +(rate /) 100),年)
此查询在MySQL中正常工作,但不适用于SQLite。
错误表示没有发现功能
有没有人知道如何解决这个问题,因为我必须使用查询来执行此操作,因为我需要一次更新超过3000条记录。
答案 0 :(得分:17)
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 *
数据库引用。
答案 1 :(得分:3)
我也在为此而苦苦挣扎,但是如果您只需要2的幂(或倍数等),则有一种更简单的方法:
使用移位运算符,例如
SELECT 1 << mytable.value
SELECT 1 << (table.x + etc..)
答案 2 :(得分:2)
如果您在.NET项目中使用SQLite NuGet包,则可以编写扩展方法并在运行时绑定它;
<!DOCTYPE html>
<html>
<head>
<script>
var red = "https://s23.postimg.org/bo5a8hzsr/red_jpg.png"
var yellow = "https://s23.postimg.org/bo5a8hzsr/red_jpg.png"
var green = "https://s29.postimg.org/5ljr1ha3r/green.png"
var lights=["red","yellow","green"]
function changered()
{
var img = document.getElementById("light");
img.src="lights[0]";
return false;
}
function changeyellow()
{
var img = document.getElementById("light");
img.src="lights[1]";
return false;
}
function changegreen()
{
var img = document.getElementById("light");
img.src="lights[2]";
return false;
}
</script>
</head>
<body>
<button id="red" onclick="setTimeout(changeyellow, 3000),setTimeout(changered, 6000),setTimeout(changegreen, 12000)">automatic</button>
<button id="red" onclick="changered();">red</button>
<button id="yellow" onclick="changeyellow();">yellow</button>
<button id="green" onclick="changegreen();">green</button>
<img id="light" src="https://s29.postimg.org/5ljr1ha3r/green.png" />
<br><br><br>
</body>
</html>
然后像这样使用它;
[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);
}
}
答案 3 :(得分:1)
SQLite不提供电源功能或操作员。您必须通过sqlite3_create_function…
自行实施。
答案 4 :(得分:1)
http://richkidsondrugs.tumblr.com/post/165870389/upgrading-sqlite-to-support-math-functions-on-cocoa
步骤是建立数学扩展库,一些名叫Liam Healy的好人写道:
在终端输入以下命令:
步骤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,然后您可以在xcode的ios应用程序中使用它。
现在在您的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 :(得分:1)
实际上 sqlite 确实有 pow/power
作为内置数学函数,但是您需要使用 DSQLITE_ENABLE_MATH_FUNCTIONS
启用它。
来自https://www.sqlite.org/lang_mathfunc.html#pow:
<块引用>下面显示的数学函数是 SQLite 合并源文件的一部分,但只有在使用 -DSQLITE_ENABLE_MATH_FUNCTIONS 编译时选项编译合并时才有效。
答案 6 :(得分:0)
您还可以通过python创建一个SQLite 用户定义函数。基于docs.python.org上的示例:sqlite3.Connection.create_function
创建python函数:
def sqlite_power(x,n):
return int(x)**n
print(sqlite_power(2,3))
# 8
基于python函数创建一个SQLite用户定义函数:
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
答案 7 :(得分:0)
这可以通过SQL解决
WITH RECURSIVE pow(exponent, exponent_remainder, base, result) as (
--FIRST EXPRESSION
SELECT exponent,exponent -1 , 10, 10
FROM table1
union all
--SECOND EXPRESSION
select tm.exponent,pow.exponent_remainder -1, pow.base,pow.result * pow.base
from table1 tm
join pow
on tm.exponent = pow.exponent
where pow.exponent_remainder >= 0
)
select pow.result
from pow
where pow.exponent_remainder = 0;