我需要通过ODBC将旧程序从MS SQL迁移到SQLite。我没有源代码。它在写入数据时工作得很好,但是一些带有TOP子句的select不起作用。来自可执行文件的查询字符串是:
SELECT TOP %ld [%s] FROM [%s] WHERE ( [%s] < %f )
查询针对单个字段。我需要删除"TOP % old"部分,但保留结果。正确的查询是这样的:
SELECT "%s" FROM "%s" WHERE ( "%s" < %f )
这个字符串被传递给sprintf或类似的C函数,所以我需要将%ld作为第一个参数,但结果应该与第一个查询相同。
是否有一种方法可以保持% old而不改变结果,同时将数据库从MS SQL更改为SQLite?
编辑1:这是一个32位的Windows程序。编辑2:如果我使用下一个字符串:
SELECT "%.*s" FROM "%s" WHERE ( "%s" < %f )
我可以得到非常接近的结果,但我失去了请求的行数。此外,如果第一个参数小于列名的字符数,则会出现SQL异常。
编辑3:Aloso:
SELECT ( %ld * 0 ) + "%s" FROM "%s" WHERE ( "%s" < %f )
它要求列是数字类型,这是通常的情况。避免了来自EDIT 2的异常。
使用注释:
SELECT /*%ld*/ [%s] FROM [%s] WHERE ( [%s] < %f )
对于SQLite 3.8.3或更高版本,您可以使用公共表表达式将第一个值放入LIMIT子句:
WITH L(x) AS (SELECT %ld)
SELECT [%s] FROM [%s] WHERE [%s] < %f LIMIT (SELECT x FROM L);
如果您的printf
类函数支持属性排序,您可以轻松更改查询。
printf("1 = %2$d, 2 = %1$d", 1, 2); // prints "1 = 2, 2 = 1"
所以试试这样写:
SELECT %2$s FROM %3$s WHERE ( %4$s < %5$f ) LIMIT %1$ld