仅通过 where 子句,通过字符串字段将 SQL 查询限制为 10,000 个结果
Limiting SQL query to 10,000 results by where clause only, by string field
我有一个有趣的问题正在努力解决。
我正在通过网络从数据库中检索数据 API。我可以直接访问数据库进行测试,但我的应用程序需要通过 API 读取数据。在 API 中,我基本上可以为 SQL 语句提供 where 子句,该语句从我为 Web API 指定的 table 中检索我的数据。我需要以 ~10,000 块为单位检索数据,以免服务器过载(Web 服务未优化,并且检索的结果越多,速度就越慢)。对于大多数 tables,有一个连续的数字 ID 字段,我可以用它来限制我的查询。所以完整的查询看起来像这样:
SELECT * FROM TABLE WHERE ID > 0 and ID <= 10000
我只能通过 API.
提供该查询的 where 子句组件
ID > 0 and ID <= 10000
对于一个特定的 table,通常的 ID 字段不可用。有一个不同的 ID 字段,它也包含顺序数值,但该字段是 String 类型。由于我向网络提供的 where 子句 API 是作为某种准备语句处理的,因此它不会处理任何函数。所以我无法将 ID 转换为 int:
CAST(ID2 as int) > 0 and CAST(ID2 as int) <= 10000
如果我对字符串值使用 > 或 < 比较,它遵循字母顺序,并且您会遇到令人讨厌的行为,例如 2,000 大于 100,000。这打破了我之前一直在使用的逻辑。
有谁知道如何使用此字符串 ID 字段将我的检索限制为 10,000 个条目?我敢肯定有一些逻辑可以做到这一点,但我一直无法理解它。
where 子句中的隐式转换也 returns 一个错误:
(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 个结果。我们只需要尊重它从第一个 digit/letter 开始排序,并忽略 ID 中数字的位值。因此,大于 10 的数量级但以较低数字开头的数字被视为较小:
By alphabetical sorting 9 > 100000
因此我们可以使用这样的 where 子句:
ID2 > '100000' and ID2 <= '101000'
该查询将包括从 100,000 到 101,000 和从 1,000,000 到 1,010,000 的所有 ID。理论上它还会包括从 10,000,000 到 10,100,000 和 100,000,000 到 101,000,000 等的 ID,但我知道我的值范围从 ~100,000 到 ~4,000,000(6 到 7 个数字),因此该范围与此 DB 无关。然后我可以逐步完成,一直到:
ID2 > '999000' and ID2 <= '999999'
这将涵盖从 100,000 到 9,999,999 的所有值,让我在 899 步中获取所有数据。
感谢您提供的所有其他想法!
我有一个有趣的问题正在努力解决。
我正在通过网络从数据库中检索数据 API。我可以直接访问数据库进行测试,但我的应用程序需要通过 API 读取数据。在 API 中,我基本上可以为 SQL 语句提供 where 子句,该语句从我为 Web API 指定的 table 中检索我的数据。我需要以 ~10,000 块为单位检索数据,以免服务器过载(Web 服务未优化,并且检索的结果越多,速度就越慢)。对于大多数 tables,有一个连续的数字 ID 字段,我可以用它来限制我的查询。所以完整的查询看起来像这样:
SELECT * FROM TABLE WHERE ID > 0 and ID <= 10000
我只能通过 API.
提供该查询的 where 子句组件ID > 0 and ID <= 10000
对于一个特定的 table,通常的 ID 字段不可用。有一个不同的 ID 字段,它也包含顺序数值,但该字段是 String 类型。由于我向网络提供的 where 子句 API 是作为某种准备语句处理的,因此它不会处理任何函数。所以我无法将 ID 转换为 int:
CAST(ID2 as int) > 0 and CAST(ID2 as int) <= 10000
如果我对字符串值使用 > 或 < 比较,它遵循字母顺序,并且您会遇到令人讨厌的行为,例如 2,000 大于 100,000。这打破了我之前一直在使用的逻辑。
有谁知道如何使用此字符串 ID 字段将我的检索限制为 10,000 个条目?我敢肯定有一些逻辑可以做到这一点,但我一直无法理解它。
where 子句中的隐式转换也 returns 一个错误:
(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 个结果。我们只需要尊重它从第一个 digit/letter 开始排序,并忽略 ID 中数字的位值。因此,大于 10 的数量级但以较低数字开头的数字被视为较小:
By alphabetical sorting 9 > 100000
因此我们可以使用这样的 where 子句:
ID2 > '100000' and ID2 <= '101000'
该查询将包括从 100,000 到 101,000 和从 1,000,000 到 1,010,000 的所有 ID。理论上它还会包括从 10,000,000 到 10,100,000 和 100,000,000 到 101,000,000 等的 ID,但我知道我的值范围从 ~100,000 到 ~4,000,000(6 到 7 个数字),因此该范围与此 DB 无关。然后我可以逐步完成,一直到:
ID2 > '999000' and ID2 <= '999999'
这将涵盖从 100,000 到 9,999,999 的所有值,让我在 899 步中获取所有数据。
感谢您提供的所有其他想法!