按 <int or varchar> 排序
ORDER BY <int or varchar>
我在存储过程中有一个查询,需要按整数列或 varchar
列排序,具体取决于传递给该过程的参数之一。
我将此作为我的 ORDER BY
子句:
...
ORDER BY
CASE @ReportType
WHEN 1 THEN
ItemName + SubItemName
WHEN 2 THEN
ItemName + SubItemName
WHEN 3 THEN
SubItemName
WHEN 4 THEN
CONVERT(int,ItemCode)
ELSE
ItemName
END
为了清楚起见,我的 table 结构是这样的(省略了不相关的列):
ItemName ItemCode SubItemName SubItemCode
Apple AA1 Fuji FJ1
Apple AA1 Gala GL1
Chicquita 1
DelMonte 2
Plantain -1
Orange OR1 Satsuma SS3
Orange OR1 Valencia VL2
如果我尝试 运行 使用 @ReportType 为 1,2 或 4 的查询一切正常,但如果我传递 3,我会收到错误消息:
Conversion failed when converting the varchar value 'Orange' to data type int.
我认为这是因为 ORDER BY
子句中的每个 case 都必须具有相同的数据类型。我知道我可以将所有内容都转换为 varchar,但是如果我按 CONVERT(varchar,ItemCode)
排序,我会得到奇怪的排序:
Chicquita 1
Plantain -1
DelMonte 2
是否可以在某些情况下按 varchar 字段排序,而在其他情况下按整数排序?
问题是 CASE
return 是单一类型。所以,只需在 order by
:
中使用多个键
ORDER BY (CASE WHEN @ReportType IN (1, 2) THEN ItemName + SubItemName END),
(CASE WHEN @ReportType = 3 THEN SubItemName END),
(CASE WHEN @ReportType = 4 THEN CONVERT(int, ItemCode) END),
ItemName
CASE
表达式没有 ELSE
子句,因此它们 return NULL
表示不匹配的值。
我在存储过程中有一个查询,需要按整数列或 varchar
列排序,具体取决于传递给该过程的参数之一。
我将此作为我的 ORDER BY
子句:
...
ORDER BY
CASE @ReportType
WHEN 1 THEN
ItemName + SubItemName
WHEN 2 THEN
ItemName + SubItemName
WHEN 3 THEN
SubItemName
WHEN 4 THEN
CONVERT(int,ItemCode)
ELSE
ItemName
END
为了清楚起见,我的 table 结构是这样的(省略了不相关的列):
ItemName ItemCode SubItemName SubItemCode
Apple AA1 Fuji FJ1
Apple AA1 Gala GL1
Chicquita 1
DelMonte 2
Plantain -1
Orange OR1 Satsuma SS3
Orange OR1 Valencia VL2
如果我尝试 运行 使用 @ReportType 为 1,2 或 4 的查询一切正常,但如果我传递 3,我会收到错误消息:
Conversion failed when converting the varchar value 'Orange' to data type int.
我认为这是因为 ORDER BY
子句中的每个 case 都必须具有相同的数据类型。我知道我可以将所有内容都转换为 varchar,但是如果我按 CONVERT(varchar,ItemCode)
排序,我会得到奇怪的排序:
Chicquita 1
Plantain -1
DelMonte 2
是否可以在某些情况下按 varchar 字段排序,而在其他情况下按整数排序?
问题是 CASE
return 是单一类型。所以,只需在 order by
:
ORDER BY (CASE WHEN @ReportType IN (1, 2) THEN ItemName + SubItemName END),
(CASE WHEN @ReportType = 3 THEN SubItemName END),
(CASE WHEN @ReportType = 4 THEN CONVERT(int, ItemCode) END),
ItemName
CASE
表达式没有 ELSE
子句,因此它们 return NULL
表示不匹配的值。