在 SQLite 中的我的数据集上,任何对数字进行排序的查询(即
GROUP BY
子句)均按字母顺序排序 (1, 11, 12, 2),而不是按数字排序 (1, 2, 11, 12)。返回的数据为例如 999,000,000、998,000,000、970,000。底层埋藏着10亿以上的价值。
常见的解决方案似乎是确保列设置为整数而不是文本,但问题仍然存在。我没有使用复杂的查询:
SELECT
Track, Artist, SpotStreams, YouViews, TPosts
FROM
SongData
GROUP BY Track
ORDER BY SpotStreams DESC
第一个图像是我所有列的设置,第二个是查询和结果:表架构的图像,包括每列的数据类型。 使用的查询导致了错误。
尽管数据类型不同,它是否将数字视为字符串?
您可以尝试使用 CAST 函数强制转换为整数。
如
CAST(SpotStreams AS INTEGER)
根据您的屏幕截图,数字中包含逗号,这意味着您不小心在这些列中存储了
text
值。请注意,SQLite 允许在任何列中存储任何值(STRICT
表中除外),请阅读更多此处。
如果您只想对值进行排序而不修改基础数据,则可以删除逗号并将数字转换为
ORDER BY
中的整数。虽然这会很慢,但如果您不想修改任何数据,这仍然很有用。
-- Some sample data.
sqlite> create table numbers (number integer);
sqlite> insert into numbers values ('1,234'), ('56'), ('78'), (9);
-- These are the actual stored types. Values with commas are stored as `text`.
sqlite> select number, typeof(number) from numbers;
1,234|text
56|integer
78|integer
9|integer
-- This does not work at all since some columns are strings.
sqlite> select * from numbers order by number;
9
56
78
1,234
-- This does not work if the numbers have commas since `1,234` becomes just `1`.
sqlite> select * from numbers order by cast(number as integer);
1,234
9
56
78
-- This works, but is slower than storing actual numbers.
sqlite> select * from numbers order by cast(replace(number, ',', '') as integer);
9
56
78
1,234
要解决此问题,您可以运行 UPDATE 查询。 请仅在数据副本上运行此操作,因为这将修改数据库的内容,并且如果存在错误,您可能会丢失数据。
sqlite> update numbers set number = cast(replace(number, ',', '') as integer);
-- All values are numbers now, so sorting works as expected.
sqlite> select number, typeof(number) from numbers order by number;
9|integer
56|integer
78|integer
1234|integer