Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中按大小写顺序使用select语句中使用的函数时出错_Sql_Sql Server_Sql Order By - Fatal编程技术网

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

在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

我有下面的表结构,我想使用我在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 + ' ' + 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
,这样可以利用这些列上的任何覆盖索引,避免排序。