ORDER BY在SQL Server 2012中使用特定顺序

时间:2015-08-20 05:47:46

标签: sql sql-server-2012

我必须显示按以下条件排序的数据表

首先应该是

私有字段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

3 个答案:

答案 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的行将首先出现。实际上,我们现在有两组行,每组都转到下一个排序表达式。

不幸的是,按field1field2对每个进行排序会先输入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