sql - T-SQL ORDER BY 根据条件

标签 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/等)进行排序,具体取决于属性的 valueType。

有什么建议吗?

限制:

PIVOT 是目前我们想到的唯一选择,但实际上不可能,因为数据库很大,我需要查询尽可能快。

提前致谢

迈克尔。

最佳答案

如果问题是您不想动态构建查询,则使用此order by 结构:

order by case @orderby
    when 'status' then status
    when 'frequency' then frequency
    end
option (recompile)

您将传递 @orderby 参数。最后的recompileoption是强制引擎根据传入的参数构建新的计划,即假设你使用的是存储过程。

关于sql - T-SQL ORDER BY 根据条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12958536/

相关文章:

MySQL 其中 DateTime 大于今天

sql - DB2(和 Derby)使用 Case 语句进行 Pivot Join

mysql - 如何将两个查询结果显示为一个

c# - 如何找出该语句生成的实际 SQL?

sql-server - 如何将 postgresql 转储恢复到 SQL Server 实例?

java - 如何在 AWS 实例中设置与 Mysql 的 jdbc 连接?

mysql - 没有嵌套 select 的两个 SQL 计数

sql-server - 两个日期之间的 SQL 时间差导致 hh :mm:ss

mysql - 计算字符串中唯一字符的数量

SQL 聚合函数 : Sum of some rows in another row