我正在编写某种资源管理系统。
资源是定义的实例。定义是元数据,基本上它包含属性。
这通常是我的数据库:
TypeDefinition
id name
===============
1 CPU
PropertyDefinition
id name typeDefinitionId valueType
================================================
1 frequency 1 int
2 status 1 string
TypeInstance
id name typeDefinitionId
=================================
1 CPU#1 1
2 CPU#2 1
PropertyInstanceValue
id propertyDefinitionId typeInstanceId valueType intValue StringValue FloatValue
========================================================================================
1 1 1 int 10
2 2 1 string Pending
3 1 2 int 20
4 2 2 string Approved
的需要量: 的
根据特定属性值订购所有资源。
例如:根据状态 - >>订购所有资源含义CPU#2将出现在CPU#1之前,因为“已批准”在“待定”之前。
如果我们按照频率进行订购,CPU#1将出现在CPU#2之前,因为10在20之前。
所以我需要根据不同的列(intValue / stringValue / FloatValue / etc)对每次进行排序,具体取决于属性的valueType。
有什么建议吗?
的限制: 的
PIVOT目前是我们唯一想到的选项,但由于数据库很庞大而且我需要尽可能快地查询,所以它不可能实现。
提前多多感谢,
米甲
答案 0 :(得分:5)
如果问题是您不想动态构建查询,请使用此order by
结构:
order by case @orderby
when 'status' then status
when 'frequency' then frequency
end
option (recompile)
您将传递@orderby
参数。最终recompile
option
是强制引擎根据传递的参数构建新计划,即假设您正在使用存储过程。
答案 1 :(得分:0)
如果要使用SQL对查询结果进行排序(而不是在返回结果后在调用应用程序中对它们进行排序),则需要生成动态SQL并使用sp_executesql执行它。
答案 2 :(得分:0)
如果我理解你的问题,我会按如下方式处理:
create table [dbo]。[AllowedStringValues](PropertyDefinitionId int,stringValue varchar(250),sortOrder int)
创建一个复杂的子查询,根据行的PropertyDefinition选择适当的值(看起来需要查看3列,具体取决于它的数据类型)。
如果值是字符串类型,则使用AllowedStringValues表将子查询内部连接 (假设值存储在值列中)
内部联接ValueType上的AllowedStringValues = String AND value = stringValue OR ValueType<>串
按AllowedValues中的排序优先级排序(如果是字符串),否则按数值排序。
按个别大小排序ValueType 当'string'然后sortOrder 别的价值 端