我对订购SQL表有疑问。 我无法在堆栈或谷歌上找到解决方案。 我的表格如下:
Code Name Referent Phone Email
-----------------------------------------------------------
501 Paul 0234343 paul@paul.com
502 Andreas 03245345 Andreas@andreas.com
501 Robert 027766543 robert@robert.com
504 Samuel 0935345345 samuel@sam.com
503 Emmanuel 0935345345 emanuel@emm.com
我想首先按名称排序,然后按照代码排序,但我想在相同的代码下使用相同的代码原始如下:
Code Name Referent Phone Email
-----------------------------------------------------------
502 Andreas 03245345 Andreas@andreas.com
503 Emmanuel 0935345345 emanuel@emm.com
501 Paul 0234343 paul@paul.com
501 Robert 027766543 robert@robert.com
504 Samuel 0935345345 samuel@sam.com
正如你所看到的那样,我希望列号为501,首先是名称列为空的项目,而不是列为501代码和空名称栏的列。
@Rob使用 COALESCE(姓名,参考), 码 我根据需要按字母顺序排列按行排序的行,但不是按代码排序,例如我有:
Code Name Referent
---------------------------------
502 Andreas NULL
501 Caesar NULL
503 Emmanuel NULL
504 Marcus NULL
501 NULL Marcel
正如你所看到的,带有空名称的501不会出现在Caesar下但不会出现在504(Marcus)下,按字母顺序,似乎Referent列在Name列后跟'M'字符。
答案 0 :(得分:2)
您可以使用COALESCE
中的ORDER BY
功能。假设该表名为Names
,则以下查询将实现此目的:
SELECT *
FROM [Names]
ORDER
BY COALESCE(Name, Referent),
Code
COALESCE
function正在做的事情基本上就是说,"返回列为第一列的值作为非空的参数"。然后ORDER BY
使用它来确定返回的行的顺序。
这确实假设数据存储为NULL,而不是空字符串。如果它实际存储为空字符串,那么您可以使用NULLIF
function来实现此目的:
SELECT *
FROM [Names]
ORDER
BY COALESCE(NULLIF(Name, ''), NULLIF(Referent, '')),
Code
我已使用以下测试工具将这些查询放在一起:
CREATE TABLE [Names]
(
Code INT,
Name NVARCHAR(100),
Referent NVARCHAR(100),
Phone NVARCHAR(100),
Email NVARCHAR(100)
)
INSERT
INTO [Names]
(
Code,
Name,
Referent,
Phone,
Email
)
VALUES ( 501, 'Paul', NULL, '0234343', 'paul@paul.com' ),
( 502, 'Andreas', NULL, '03245345', 'Andreas@andreas.com' ),
( 501, NULL, 'Robert', '027766543', 'robert@robert.com' ),
( 504, 'Samuel', NULL, '0935345345', 'sam@samuel.com' ),
( 503, 'Emmanuel', NULL, '0935345345', 'emanuel@emm.com')
答案 1 :(得分:1)
我不确定这是否有效但也许您可以通过CONCAT订购
ORDER BY CONCAT(Name, Referent)
从未尝试过,我现在无法测试。很抱歉,如果它是不可见的:)
应该工作,如果你使用Pipe分隔字符串,至少有些东西是低的,比如'不可能'
Concat(Name,' ',Referent)
答案 2 :(得分:0)
以下是一次按两列排序的解决方案。
<div class="calendar_episode">
<input type="checkbox" class="mark_watched">
</div>
<div class="calendar_episode">
<input type="checkbox" class="mark_watched">
</div>
<div class="calendar_episode">
<input type="checkbox" class="mark_watched">
</div>
<button>Run function</button>
OR
.ep_watched {
opacity: 0.6;
background: rgb(235, 235, 235);
}
答案 3 :(得分:0)
如果你的DBMS支持Windowed Aggregates,那很简单:
order by max(name) over (partition by code)
,name nulls last
否则你需要一个标量子查询(可能非常低效):
from mytable as t1
...
order by (select max(name) from mytable as t2 where t1.code = t2.code)
,name nulls last