C语言 如何从查询中删除MS SQL的TOP子句,使其在SQLite上工作



我需要通过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

最新更新