ORDER BY <int或=“”varchar =“”>

时间:2016-11-24 14:52:28

标签: sql sql-order-by type-conversion sqldatatypes

我在存储过程中有一个查询,需要按整数列或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

为清楚起见,我的表结构是这样的(省略了不相关的列):

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子句中的每个案例都必须具有相同的数据类型。我知道我可以将所有内容转换为varchar,但如果按CONVERT(varchar,ItemCode)排序,我会得到时髦的排序:

Chicquita    1
Plantain     -1 
DelMonte     2

是否可以在某些情况下按varchar字段排序,但在其他情况下是整数?

1 个答案:

答案 0 :(得分:3)

问题是CASE返回单一类型。因此,只需在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子句,因此对于不匹配的值,它们会返回NULL