我必须显示按以下条件排序的数据表
首先应该是
私有字段1和字段2匹配
私人字段1匹配
私人
非私人字段1和字段2匹配
非私人字段1匹配
非私人
我在SQL方面非常弱,只有我知道的顺序是
select *
from sampleTable
order by field1
我知道如何使用C#和jQuery按照此顺序对数据进行排序。有没有办法用T-SQL完成同样的工作?
表格就像这样
id field1 field2 private
---------------------------
316 test1 test 1
319 test2 NULL 0
320 test3 NULL 0
321 test4 test4 1
322 NULL NULL 0
323 NULL NULL 1
答案 0 :(得分:2)
您可以尝试以下方式:
SELECT * FROM sampleTable
ORDER BY
private DESC,
CASE WHEN field1 IS NULL THEN 1 ELSE 0 END,
CASE WHEN field2 IS NULL THEN 1 ELSE 0 END
我假设'匹配'意味着“不是空”'
<强>更新强>
我应该指出,如果要对field1和field2中的非null值进行排序,则需要一个额外的sort子句:
SELECT * FROM sampleTable
ORDER BY
private DESC,
CASE WHEN field1 IS NULL THEN 1 ELSE 0 END, field1,
CASE WHEN field2 IS NULL THEN 1 ELSE 0 END, field2
所以,更详细地解释一下:
private
字段首先出现,因为它按降序排序,标记为private的行将首先出现。实际上,我们现在有两组行,每组都转到下一个排序表达式。
不幸的是,按field1
或field2
对每个进行排序会先输入NULL,这不是您想要的。 CASE
表达式有效排序&#39; 1&#39;如果它是NULL,并且&#39; 0&#39;除此以外。这将所有NULL移动到结尾,因为1>现在他们已经分开,我们可以按字段值进一步对每个组进行排序。
答案 1 :(得分:1)
如果您的条件取决于列值
,请尝试使用case
解决方案
select * from sampleTable
ORDER BY
CASE WHEN @columnA = 'X' AND @columnB = 'Z' THEN name
.
.
.
.
.
.
CASE WHEN @columnA = 'Y' AND @columnB = 'W' THEN name END
我真的不了解你的情况所以我把它写成一个例子,但你可以把你想要的任何条件
答案 2 :(得分:1)
我首先完全误解了你的问题,这是一个新答案:
SELECT * from sampleTable ORDER BY
private desc,
CASE WHEN field1=field2 THEN 2 WHEN field1>'' THEN 1 END desc
'Match'
的含义再次不清楚。但是看到你已经接受了迈克尔的答案我猜你真正的意思是“不是空的”。然后我的版本将是:
SELECT * from sampleTable ORDER BY
private desc,
CASE WHEN field1>='' THEN 1 ELSE 0 END
+CASE WHEN field2>='' THEN 1 ELSE 0 END desc,
field1, field2