Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 使用多个CASE子句对空值进行排序_Sql_Sql Server - Fatal编程技术网

Sql 使用多个CASE子句对空值进行排序

Sql 使用多个CASE子句对空值进行排序,sql,sql-server,Sql,Sql Server,我有一个非常简单的ORDER BY子句,它基于两个变量进行排序: ORDER BY CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'asc' THEN emp.FirstName END asc, CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'desc' THEN emp.FirstName END desc 我的问题是,当emp.FirstName为空时,它在排序中排在第一

我有一个非常简单的ORDER BY子句,它基于两个变量进行排序:

ORDER BY 
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'asc' THEN emp.FirstName END asc,
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'desc' THEN emp.FirstName END desc
我的问题是,当emp.FirstName为空时,它在排序中排在第一位。为了解决这个问题,我尝试介绍另一个案例,但是我似乎无法让语法处理多个案例

这是订单的当前版本:

ORDER BY 
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'asc' THEN CASE WHEN emp.FirstName = '' THEN 2 ELSE 1 END, emp.FirstName asc,
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'desc' THEN CASE WHEN emp.FirstName = '' THEN 2 ELSE 1 END, emp.FirstName desc

如上所述,这在第一个端点上有语法错误。

最简单的方法可能是替换一个值。合理的解决办法是:

ORDER BY 
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'asc' THEN COALESCE(emp.FirstName, 'ZZZ') END asc,
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'desc' THEN COALESCE(emp.FirstName, 'ZZZ') END desc
'ZZZ'
更好的值是
'~'
,因为这是一个非常大的ASCII值


注意:如果您有不同的排序规则,则可能需要其他值。

最简单的方法可能是替换一个值。合理的解决办法是:

ORDER BY 
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'asc' THEN COALESCE(emp.FirstName, 'ZZZ') END asc,
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'desc' THEN COALESCE(emp.FirstName, 'ZZZ') END desc
'ZZZ'
更好的值是
'~'
,因为这是一个非常大的ASCII值


注意:如果您有不同的排序规则,则可能需要其他值。

您似乎也在混合数据类型。内部
大小写
返回一个
int
,其中作为
外部
将在
ELSE
子句中返回一个
varchar
。但是,我认为这个问题可以通过使用
ISNULL
来解决。这是一个猜测,但由于缺乏样本和预期结果:

ORDER BY 
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'asc' THEN ISNULL(emp.FirstName,'zzzzzzz') END asc,
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'desc' THEN ISNULL(emp.FirstName,'zzzzzzzz') END desc

您似乎也在混合数据类型。内部
大小写
返回一个
int
,其中作为
外部
将在
ELSE
子句中返回一个
varchar
。但是,我认为这个问题可以通过使用
ISNULL
来解决。这是一个猜测,但由于缺乏样本和预期结果:

ORDER BY 
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'asc' THEN ISNULL(emp.FirstName,'zzzzzzz') END asc,
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'desc' THEN ISNULL(emp.FirstName,'zzzzzzzz') END desc
你也可以试试这个

ORDER BY 
    CASE WHEN @sortCol = 'OwnerName' AND emp.FirstName IS NULL THEN 1 ELSE 0 END ASC, 
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'asc' THEN emp.FirstName END asc,
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'desc' THEN emp.FirstName END desc
你也可以试试这个

ORDER BY 
    CASE WHEN @sortCol = 'OwnerName' AND emp.FirstName IS NULL THEN 1 ELSE 0 END ASC, 
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'asc' THEN emp.FirstName END asc,
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'desc' THEN emp.FirstName END desc

也许
reverse
会让脚本更有趣

ORDER BY 
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'asc' THEN emp.FirstName 
    else reverse(emp.FirstName) END asc

也许
reverse
会让脚本更有趣

ORDER BY 
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'asc' THEN emp.FirstName 
    else reverse(emp.FirstName) END asc

我想你想得到一个字段来排序回退


如果不为null,则使用OwnerName,否则使用名字

好了:)

复制粘贴示例

SET @sortCol = 'OwnerName', @sortDir = 'DESC'; 

Select
    tmp.*
FROM (
    SELECT
        NULL as OwnerName,
        '2' as FirstName
    UNION SELECT 
       '5' as OwnerName,
        '4' as FirstName
    UNION SELECT 
       '1' as OwnerName,
        '6' as FirstName
    ) tmp
ORDER BY
    CASE WHEN
        @sortCol = 'OwnerName' AND @sortDir = 'ASC'
    THEN
        CASE WHEN
            OwnerName IS NOT NULL
        THEN
            OwnerName
        ELSE
            FirstName
        END
    END ASC,
    CASE WHEN
        @sortCol = 'OwnerName' AND @sortDir = 'DESC'
    THEN
        CASE WHEN
            OwnerName IS NOT NULL
        THEN
            OwnerName 
        ELSE
            FirstName       
        END 
    END DESC

我想你想得到一个字段来排序回退


如果不为null,则使用OwnerName,否则使用名字

好了:)

复制粘贴示例

SET @sortCol = 'OwnerName', @sortDir = 'DESC'; 

Select
    tmp.*
FROM (
    SELECT
        NULL as OwnerName,
        '2' as FirstName
    UNION SELECT 
       '5' as OwnerName,
        '4' as FirstName
    UNION SELECT 
       '1' as OwnerName,
        '6' as FirstName
    ) tmp
ORDER BY
    CASE WHEN
        @sortCol = 'OwnerName' AND @sortDir = 'ASC'
    THEN
        CASE WHEN
            OwnerName IS NOT NULL
        THEN
            OwnerName
        ELSE
            FirstName
        END
    END ASC,
    CASE WHEN
        @sortCol = 'OwnerName' AND @sortDir = 'DESC'
    THEN
        CASE WHEN
            OwnerName IS NOT NULL
        THEN
            OwnerName 
        ELSE
            FirstName       
        END 
    END DESC
给你:

CREATE TABLE T(
    FirstName VARCHAR(45)
    );

DECLARE @sortCol VARCHAR(45) = 'OwnerName';
DECLARE @sortDir VARCHAR(5) = 'asc';

INSERT INTO T VALUES
('One'),
('Two'),
(''),
(NULL),
('Three'),
('Four');

SELECT *
FROM T
ORDER BY 
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'asc' THEN IIF(FirstName = '' OR FirstName IS NULL, 'ZZZZZZZZ', FirstName) END asc,
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'desc' THEN IIF(FirstName = '' OR FirstName IS NULL, 'ZZZZZZZZ', FirstName) END desc;
虽然你说:我的问题是当emp.FirstName为空时,它在排序中排在第一位,但我认为你最好也检查
EmptyString
('')或
NULL

给你:

CREATE TABLE T(
    FirstName VARCHAR(45)
    );

DECLARE @sortCol VARCHAR(45) = 'OwnerName';
DECLARE @sortDir VARCHAR(5) = 'asc';

INSERT INTO T VALUES
('One'),
('Two'),
(''),
(NULL),
('Three'),
('Four');

SELECT *
FROM T
ORDER BY 
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'asc' THEN IIF(FirstName = '' OR FirstName IS NULL, 'ZZZZZZZZ', FirstName) END asc,
    CASE WHEN @sortCol = 'OwnerName' AND @sortDir = 'desc' THEN IIF(FirstName = '' OR FirstName IS NULL, 'ZZZZZZZZ', FirstName) END desc;
虽然你说:我的问题是当emp.FirstName为空时,它在排序中排在第一位,但我认为你最好也检查
EmptyString
('')或
NULL


您是否尝试在您的
案例中使用
ELSE
?您是否尝试在您的
案例中使用
ELSE
?谢谢您的回答。我用了“ZZZ”,效果很好。有趣的是,使用“~”再次将所有空记录从头开始购买。@CBreeze。这很奇怪
~
{
是紧跟在
z
之后的字符。谢谢你的回答。我使用了'ZZZ',效果非常好。有趣的是,使用'~'再次购买了所有的空记录。@CBreeze…这对
~
很好奇{
是紧跟在
z
之后的字符。我的坏,标题上写着“最后一个”对不起:D-我会保留我的解决方案,也是一个选项:)我的坏,标题上写着“最后一个”抱歉:D-我会保留我的解决方案,也是一个选项:)OP说:我的问题是,当emp.FirstName为空时,它在排序中排在第一位,而不是
Null
,他的意思是
(“”)
我想。OP说:我的问题是,当emp.FirstName为空时,它在排序中排在第一位,而不是
Null
,我认为他的意思是
('')