sql - 在 SQL Server 中使用按大小写顺序在 select 语句中使用的函数时出错

标签 sql sql-server sql-order-by

我有下面的表结构,我想通过使用 case 关键字按顺序使用我在 select 语句中使用的函数。但我收到错误消息,指出 FullName 是无效列。

CREATE TABLE STUDENTS
(
     ID INT IDENTITY(1, 1) ,
     FirstName VARCHAR(50) ,
     LastName VARCHAR(50)
)

向表 STUDENTS 中插入一些数据

INSERT  INTO STUDENTS
VALUES  ( 'kamal', 'sharma' )

INSERT  INTO STUDENTS
VALUES  ( 'john', 'jack' )

INSERT  INTO STUDENTS
VALUES  ( 'Rahul', 'Thomson' )

此语句有效

SELECT 
       ID
     , FirstName + ' ' + LastName AS FullName
FROM STUDENTS
ORDER BY FullName ASC

我需要这个,但它说 FullName 是无效列。

DECLARE @VAL INT  
SET @VAL = 1

SELECT ID
    ,FirstName + ' ' + LastName AS FullName
FROM STUDENTS
ORDER BY CASE 
        WHEN @VAL = 1
            THEN FullName
        END ASC
    ,CASE 
        WHEN @VAL = 2
            THEN FullName
        END DESC

Msg 207, Level 16, State 1, Line 10
Invalid column name 'FullName'.
Msg 207, Level 16, State 1, Line 14
Invalid column name 'FullName'.

预先感谢您的帮助。

最佳答案

SELECT 中定义的列别名不能在相应 ORDER BY 的表达式内部使用。

要么重复底层定义。

SELECT ID
    ,FirstName + ' ' + LastName AS FullName
FROM STUDENTS
ORDER BY CASE 
        WHEN @VAL = 1
            THEN FirstName + ' ' + LastName
        END ASC
    ,CASE 
        WHEN @VAL = 2
            THEN FirstName + ' ' + LastName
        END DESC

或者在不同级别定义别名。例如派生表或 CTE。

WITH T
     AS (SELECT ID,
                FirstName + ' ' + LastName AS FullName
         FROM   STUDENTS)
SELECT *
FROM   T
ORDER  BY CASE
            WHEN @VAL = 1 THEN FullName
          END ASC,
          CASE
            WHEN @VAL = 2 THEN FullName
          END DESC 

关于sql - 在 SQL Server 中使用按大小写顺序在 select 语句中使用的函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17313865/

相关文章:

mysql - 从数百万条记录中选择一条记录慢

sql-server - 将日期名称(dw 脚本从 sqlserver 转换为 sqlite

sql - 如何在线创建非聚集索引(如果可用)

mysql - mysql 按值排序

sql - 无法理解此 SQL 代码

SQL 查询 - 需要在 SELECT 或子查询中搜索值日期范围

sql - 使用内连接两次

MySQL - 从最低到最高排序子串数字

mysql - 我可以查询按两列排序吗?

python - 音乐轨道数据库