如何在SQLite中找到一个数字的力量

时间:2012-11-02 05:55:10

标签: database sqlite

我想更新数据库中的兴趣字段。我的SQL查询如下所示

  

更新Table_Name set Interest = Principal * Power((1 +(rate /)   100),年)

此查询在MySQL中正常工作,但不适用于SQLite。

错误表示没有发现功能

有没有人知道如何解决这个问题,因为我必须使用查询来执行此操作,因为我需要一次更新超过3000条记录。

8 个答案:

答案 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;