-1

我正在尝试根据别名订购选择,但我不知道如何。这是一个例子:

select distinct top 100 id, 
                    col1, 
                    col2, 
                    CASE WHEN @orderFormat = 'this' then col1
                         WHEN @orderFormat = 'that' then col2
                    END as orderby
from table
where col1 = like '%'
order by Len(orderby) asc, orderby asc

每当我将别名“orderby”作为参数传递时,它都会被报告为无效列。

我的目标是能够以字母数字方式对变量列进行排序。我知道 'order by Len(orderby) asc, orderby asc 有效,但不能使用别名。

有谁知道解决这个问题的好方法,或者我做错了什么?

谢谢!

编辑:

我已经设法将选择功能简化为:

select top 200 Clip_Name as orderby
               from Clips
order by       Len(orderby) asc, orderby asc

Clip_Name 被声明为column Clip_Name(nvarchar, not null)。Microsoft SQL Server 2008 R2 Edition 的错误是Msg 207, Level 16, State 1, Line 1 Invalid column name 'orderby'.

但是,这有效(没有别名):

select top 200 Clip_Name 
               from Clips 
order by len(FLE_ID) desc, FLE_ID desc
4

2 回答 2

5

使用 时DISTINCT,只能按实际在SELECT列表中的表达式排序。您不能引用不存在的列、别名或表达式。这是一种可能的解决方法,尽管实际上最好简单地删除DISTINCT(如果您有两行相同的行,id那么您的架构或至少该列的名称存在严重错误)。

select distinct top 100 id, 
                    col1, 
                    col2, 
                    CASE WHEN @orderFormat = 'this' then col1
                         WHEN @orderFormat = 'that' then col2
                    END as orderby,
    len(CASE WHEN @orderFormat = 'this' then col1
             WHEN @orderFormat = 'that' then col2
        END) AS ignore_this_column
from table
where col1 like '%'
order by ignore_this_column, orderby;

表达更简单,因此您不必重复表达式(并且也没有不必要的DISTINCT):

;WITH x AS 
(
  SELECT id, col1, col2, 
    orderby = CASE @orderFormat
      WHEN 'this' THEN col1
      WHEN 'that' THEN col2
    END
  FROM dbo.table
  WHERE col1 LIKE '%' -- necessary?
)
SELECT id, col1, col2
  FROM x
  ORDER BY LEN(orderby), orderby;
于 2013-03-11T16:10:28.913 回答
1

根据您的第一个查询,以及需要删除 DISTINCT 的讨论,这将起作用:

select top 100 id, 
        col1, 
        col2, 
        CASE WHEN @orderFormat = 'this' then col1
             WHEN @orderFormat = 'that' then col2
        END as orderby
from t
order by Len(CASE WHEN @orderFormat = 'this' then col1
                  WHEN @orderFormat = 'that' then col2
             END) asc, orderby asc
于 2013-03-12T16:21:03.670 回答