大家好,感谢您抽出宝贵时间调查我的问题,
背景
我正在使用ROW_NUMER()函数以及PARTITION BY..ORDER BY语句来为我的一个表中的每个值设置一个varchar值,并在其末尾增加一个int值。
SELECT component_module_id as component_module_id,
component_property_id,
'cf' + CAST(ROW_NUMBER() OVER (PARTITION BY component_module_id ORDER BY component_module_id) as VARCHAR) AS cf
FROM component_property
这里'cf'值来自cf1-cfX,用于每个component_module_id
我的问题
[每当我尝试在其他地方使用这些cf值时,例如保存在临时表中,其他Ordering和Grouping语句都会更改这些值。就像生成“ cf”值的语句被保存,而不是“ cf”值本身的保存。
将上面的查询插入临时表#t之后-
SELECT * FROM #t ORDER BY cf
我收到从cf1开始并跳转到cf10然后是cf100的'cf'值,其cf值范围从cf1到cf900 ...我应该只接收从c1到cf29范围内的值。
我的问题是-为什么此列中的值与其他任何正常值都不同?为什么将ROW_NUMBER()OVER(PARTITION BY ....))计算传递给该行的进一步查询? (如果实际上是这种情况)。最后,当我尝试按它们分组或排序时,如何将这些“ cf”值视为正常的VARCHAR值,并且不让它们发生变化。
感谢您的帮助!
SELECT component_module_id,
component_property_id,
'cf' + CAST(cf) AS VARCHAR(10)
FROM (
SELECT component_module_id,
component_property_id,
ROW_NUMBER() OVER (PARTITION BY component_module_id ORDER BY component_module_id) AS cf
FROM component_property
) a
您正在经历的行为是VARCHAR
如何对数字进行排序(它具有名称,但它使我不知道)您需要作为INT进行排序,然后在最后进行串联(通过将原始查询包装在子查询中
SELECT * FROM #t ORDER BY component_module_id, cast(replace(cf, 'cf', '') as int)