我可以根据外部 table 对 SQL 中的排序列进行优先排序吗
Can I prioritize sort columns in SQL based on an external table
我正在使用一个 table,它有几列可以根据用户设置进行排序。我正在尝试想出一种避免动态 SQL 并将排序字符串存储在首选项 table 中的方法。
我正在使用的数据示例:
User | VIP | Date | Priority | Location
---------------------------------------------------
Jim | 1 | 1/1/2019 | 0 | 105
Joe | 0 | 2/1/2019 | 0 | 104
Jack | 1 | 1/5/2019 | 1 | 105
John | 0 | 2/6/2019 | 1 | 106
Jane | 0 | 4/1/2019 | 1 | 105
Jake | 1 | 7/1/2019 | 0 | 105
排序 table 看起来像这样
Column | SortOrder | Location
------------------------------------
VIP | 2 | 105
Date | 1 | 105
Priority | -1 | 105
VIP | 1 | 104
Date | 2 | 104
Priority | 3 | 104
VIP | 1 | 106
Date | -1 | 106
Priority | 2 | 106
我的查询将使用位置作为 where 子句,因此我只会返回特定位置的值,但我想根据排序中设置的值对该位置的数据进行排序 table.
-1 将是一个非活动排序,所以如果位置是 105,我想按日期排序,然后是 VIP。如果是 104,则 VIP,然后是日期,然后是优先级,如果是 106 VIP,则优先级,不考虑日期。
我在想我也许可以做一些数学方面的事情,但我很难想出一个算法。
我试图避免将 Date ASC、VIP ASC 硬编码到 table 中并检索它并通过 Dynamic SQL 应用它(虽然我确实有这个工作,但我希望更好的非动态解决方案)。
有人有什么建议吗?
你不能用数学来做到这一点。
您可以像您提到的那样使用动态 SQL,也可以使用一堆 CASES。
首先,您需要 PIVOT 或使用子查询或其他方法来为您可能 ORDER BY 的每个列获取虚拟 SortOrder 列。然后你可以这样做:
ORDER BY CASE
WHEN [VipSortOrder]=1 THEN [VIP]
WHEN [DateSortOrder]=1 THEN [Date]
WHEN [PrioritySortOrder]=1 THEN [Priority]
END,
CASE {Same for the 2's} etc...
如果是我,我个人会使用动态 sql。
我正在使用一个 table,它有几列可以根据用户设置进行排序。我正在尝试想出一种避免动态 SQL 并将排序字符串存储在首选项 table 中的方法。
我正在使用的数据示例:
User | VIP | Date | Priority | Location
---------------------------------------------------
Jim | 1 | 1/1/2019 | 0 | 105
Joe | 0 | 2/1/2019 | 0 | 104
Jack | 1 | 1/5/2019 | 1 | 105
John | 0 | 2/6/2019 | 1 | 106
Jane | 0 | 4/1/2019 | 1 | 105
Jake | 1 | 7/1/2019 | 0 | 105
排序 table 看起来像这样
Column | SortOrder | Location
------------------------------------
VIP | 2 | 105
Date | 1 | 105
Priority | -1 | 105
VIP | 1 | 104
Date | 2 | 104
Priority | 3 | 104
VIP | 1 | 106
Date | -1 | 106
Priority | 2 | 106
我的查询将使用位置作为 where 子句,因此我只会返回特定位置的值,但我想根据排序中设置的值对该位置的数据进行排序 table.
-1 将是一个非活动排序,所以如果位置是 105,我想按日期排序,然后是 VIP。如果是 104,则 VIP,然后是日期,然后是优先级,如果是 106 VIP,则优先级,不考虑日期。
我在想我也许可以做一些数学方面的事情,但我很难想出一个算法。
我试图避免将 Date ASC、VIP ASC 硬编码到 table 中并检索它并通过 Dynamic SQL 应用它(虽然我确实有这个工作,但我希望更好的非动态解决方案)。
有人有什么建议吗?
你不能用数学来做到这一点。
您可以像您提到的那样使用动态 SQL,也可以使用一堆 CASES。
首先,您需要 PIVOT 或使用子查询或其他方法来为您可能 ORDER BY 的每个列获取虚拟 SortOrder 列。然后你可以这样做:
ORDER BY CASE
WHEN [VipSortOrder]=1 THEN [VIP]
WHEN [DateSortOrder]=1 THEN [Date]
WHEN [PrioritySortOrder]=1 THEN [Priority]
END,
CASE {Same for the 2's} etc...
如果是我,我个人会使用动态 sql。