在SQL Server中按大小写顺序使用select语句中使用的函数时出错
我有下面的表结构,我想使用我在select语句中使用的函数,通过使用case关键字进行排序。但我得到的错误是FullName是无效列在SQL Server中按大小写顺序使用select语句中使用的函数时出错,sql,sql-server,sql-order-by,Sql,Sql Server,Sql Order By,我有下面的表结构,我想使用我在select语句中使用的函数,通过使用case关键字进行排序。但我得到的错误是FullName是无效列 CREATE TABLE STUDENTS ( ID INT IDENTITY(1, 1) , FirstName VARCHAR(50) , LastName VARCHAR(50) ) DECLARE @VAL INT SET @VAL = 1 SELECT ID ,FirstName + ' ' + LastNa
CREATE TABLE STUDENTS
(
ID INT IDENTITY(1, 1) ,
FirstName VARCHAR(50) ,
LastName VARCHAR(50)
)
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'.
在表中插入一些数据
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
我需要这个,但它说全名是无效列
CREATE TABLE STUDENTS
(
ID INT IDENTITY(1, 1) ,
FirstName VARCHAR(50) ,
LastName VARCHAR(50)
)
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
或者在不同级别定义别名。e、 g.派生表或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
将其更改为:
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
试试这个-
SELECT
ID
, FullName
FROM (
SELECT
ID
, FullName = FirstName + ' ' + LastName
FROM dbo.STUDENTS
) t
ORDER BY
CASE WHEN @VAL = 1 THEN FullName END
, CASE WHEN @VAL = 2 THEN FullName END DESC
另一种变体:
DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = '
SELECT
ID
, FullName
FROM (
SELECT
ID
, FullName = FirstName + '' '' + LastName
FROM dbo.STUDENTS
) t
ORDER BY ' +
CASE WHEN @VAL = 1
THEN 'FullName'
ELSE 'FullName DESC'
END
EXEC sys.sp_executesql @SQL
围绕实际查询按部分包装订单:
SELECT ID, FullName
FROM (
SELECT ID,
FirstName + ' ' + LastName AS FullName,
CASE WHEN @VAL = 1 THEN FullName END AS OrderNumber1,
CASE WHEN @VAL = 2 THEN FullName END AS OrderNumber2
FROM STUDENTS
) data
ORDER BY OrderNumber1 ASC, OrderNumber2 DESC
只需尝试以下脚本:
SELECT ID
,FirstName + ' ' + LastName AS FullName
FROM STUDENTS
ORDER BY FirstName + ' ' + LastName ASC
您可以在
ORDER BY
中使用别名,但一旦它们位于任何类型的表达式中,它们就不再作为别名解析。您不能在同一个SELECT
列表中引用别名,因为它在这两个列表中都有定义。如果使用动态SQL可能还可以使用ORDER BY FirstName,LastName
,这样可以利用这些列上的任何覆盖索引,避免排序。