仅where子句,字符串字段将SQL查询限制为10,000个结果

问题描述

我有一个很有趣的问题,正在努力解决

我正在通过Web API从数据库中检索数据。我可以直接访问数据库进行测试,但是我的应用程序将需要通过API读取数据。在API中,我基本上可以为sql语句提供where子句,该子句从为Web API指定的表中检索数据。我需要以〜10,000的块为单位检索数据,以免使服务器超载(未优化Web服务,并且检索到的结果越多,速度将成指数级降低)。对于大多数表,都有一个顺序数字ID字段,我可以使用它来限制查询。因此完整的查询如下所示:

SELECT * FROM TABLE WHERE ID > 0 and ID <= 10000

我只能通过API提供该查询的where子句组件。

ID > 0 and ID <= 10000

对于一个特定的表,通常的ID字段不可用。有一个不同的ID字段,它也包含连续的数值,但是该字段的类型为String。由于我提供给Web API的where子句是作为某种准备好的语句处理的,因此它将不处理任何功能。因此,我无法将ID转换为int:

CAST(ID2 as int) > 0 and CAST(ID2 as int) <= 10000

如果我对字符串值使用>或

有人知道如何使用此字符串ID字段将检索限制为10,000个条目吗?我确定有一定的逻辑可以做到这一点,但是我无法将其包裹住。

where子句中的隐式转换也会返回错误

(ID2 + 0) > 0 and (ID2 + 0) <= 10000

ID2字段中的值范围从〜140,000到〜3,500,000。

我很高兴听到任何想法或建议!如果有任何不清楚的地方,请告诉我。

解决方法

这可能会影响性能,但是我看到的唯一方法是使用子查询:

SELECT * FROM TABLE WHERE ID IN (
    SELECT TOP 10000 ID
    FROM TABLE
    WHERE [someotherfield] >= [last_someotherfield] -- Might lead to duplicates
    ORDER BY [someotherfield]
)
,

我认为我已经弄清楚了。通过使用字母排序,我们仍然可以将查询限制为〜11,000个结果。我们只需要考虑它开始按第一个数字/字母排序,而忽略ID中数字的位置值。因此,以10的数量级增加但以较低的数字开头的数字将被视为较小的数字:

按照字母顺序9> 100000

因此,我们可以使用如下where子句:

ID2 > '100000' and ID2 <= '101000'

该查询将包含从100,000到101,000和从1,000,000到1,010,000的所有ID。从理论上讲,它还包括从10,000到10,100,000,从100,000的ID等,但是我知道我的值从〜100,000到〜4,000(6到7个数字)不等,因此该范围与该DB无关。然后,我可以逐步完成所有步骤:

ID2 > '999000' and ID2 <= '999999'

这将涵盖从100,000到9,999,999的所有值,并让我以899步的方式获取所有数据。

感谢提供的所有其他提示!