Sql 使用多个CASE子句对空值进行排序
我有一个非常简单的ORDER BY子句,它基于两个变量进行排序: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
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
,我认为他的意思是('')
。