gpt4 book ai didi

sql - ORDER BY ABS(CHECKSUM(NEWID())) 如何工作?

转载 作者:行者123 更新时间:2023-12-04 18:20:06 24 4
gpt4 key购买 nike

我偶然发现了一个随机代码 ID 生成器,但我不知道它是如何工作的。

SELECT TOP (5) c1
FROM
(
VALUES
('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'),
('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9')
) AS T1(c1)
ORDER BY ABS(CHECKSUM(NEWID()))

我看过以下内容:

  • 选择 NEWID() -> E8E142CC-A918-4776-AA99-2D33DC80FE28
  • 选择 CHECKSUM('E8E142CC-A918-4776-AA99-2D33DC80FE28') -> -2089106226
  • 选择 ABS(-2089106226) -> 2089106226

如果我然后尝试执行“在 2089106226 之前订购”,显然会失败

那么“ABS(CHECKSUM(NEWID()))”返回的是什么?这种类型的排序叫什么?

最佳答案

ORDER BY子句不必像您发现的那样对特定列进行排序,而是可以包含任意表达式。我认为这没有任何特殊名称,它只是 order_by_expression 中的一个动态值。 ORDER BY 的一部分documented here

ORDER BY 中的非列表达式可能是这样的

ORDER BY a_column % 5

根据列的值模数 5 等对行进行排序

ORDER BY CASE WHEN LEFT(a_column, 1) = 'Z' THEN 0 ELSE 1 END ASC, a_column ASC

强制使用 column 中的所有值以 Z 开头通过归因于 0 来排在所有其他人之前,但除此之外是按字母顺序排列的至 Z行和 1否则(零排在一之前)。

在这种情况下,表达式是 T-SQL 中随机化行顺序的常用方法:

ABS(CHECKSUM(NEWID()))

NEWID()将为 SELECT 返回的每一行调用函数语句,它会产生 5 个单独的 GUID 值。从那里开始,这 5 个中的每一个都是 passed to CHECKSUM() 它返回一个恰好是整数的索引散列值。 ABS() finally 强制为正整数。

因此最终发送到 ORDER BY 的值只是从多次调用 NEWID() 派生的整数列表, 和 ORDER BY排序整数没有问题。最后,它与对一列整数值进行排序并没有什么不同——只是这些值是在查询时生成的。

如果你运行 this demonstration on SQLFiddle几次,你会得到一个不同的排序顺序,否则递增 id在每次执行时。所以这看起来像是有问题的随机代码生成器 SQL 的作者使用 ORDER BY 的原因。是从 VALUES () 中随机选择一组 5 个字符。列表。如果你run the code generator SQL并注释掉 ORDER BY ,它将始终返回行集 A,B,C,D,E .随着ORDER BY就地,它返回一个随机集合。

关于sql - ORDER BY ABS(CHECKSUM(NEWID())) 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22056564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com