T-SQL ORDER BY根据条件

时间:2012-10-18 15:44:30

标签: sql sql-server database tsql

我正在编写某种资源管理系统。

资源是定义的实例。定义是元数据,基本上它包含属性。

这通常是我的数据库:

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目前是我们唯一想到的选项,但由于数据库很庞大而且我需要尽可能快地查询,所以它不可能实现。

提前多多感谢,

米甲

3 个答案:

答案 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执行它。

http://msdn.microsoft.com/en-us/library/ms188001.aspx

答案 2 :(得分:0)

如果我理解你的问题,我会按如下方式处理:

  1. 创建一个允许字符串值的表,确保包含一个用于指定排序优先级的列(让我们调用此AllowedValues)
      

    create table [dbo]。[AllowedStringValues](PropertyDefinitionId int,stringValue varchar(250),sortOrder int)

  2.   
  3. 创建一个复杂的子查询,根据行的PropertyDefinition选择适当的值(看起来需要查看3列,具体取决于它的数据类型)。

  4.   
  5. 如果值是字符串类型,则使用AllowedStringValues表将子查询内部连接   (假设值存储在值列中)

      

    内部联接ValueType上的AllowedStringValues = String AND value = stringValue OR ValueType<>串

  6. 按AllowedValues中的排序优先级排序(如果是字符串),否则按数值排序。

      

    按个别大小排序ValueType   当'string'然后sortOrder   别的价值   端