如何使用空字段排列2列?

时间:2017-07-15 15:42:39

标签: sql

我对订购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'字符。

4 个答案:

答案 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