如何覆盖数据然后对数据进行排序或过滤?

时间:2013-03-19 10:16:00

标签: sql variables sql-order-by

我需要编写一些SQL,我选择性地覆盖表中的某些数据,然后对其进行排序和/或过滤 过度的数据。这是一个简单的例子......

我有一张名为PET的宠物名称表

PET_NAME   PET_SPECIES PET_PK
---------- ----------- -----------
Barney     Dog         {PETGUID1}
Fergus     Cat         {PETGUID2}
Meatball   Hamster     {PETGUID3}

我有另一张表,其中包含生命状态,名为LIFE

LIF_PK     LIF_STATUS   LIF_PET_FK
---------- ------------ ------------
{LIFGUID1} Alive        {PETGUID1}
{LIFGUID2} Alive        {PETGUID2}
{LIFGUID3} Dead         {PETGUID3}

我想报告宠物及其生活状况。

SELECT          PET_NAME,
                PET_SPECIES,
                LIF_STATUS
FROM            PET
INNER JOIN      LIFE ON LIF_PET_PK=PET_PK

如果宠物死了,我不想报告这个名字,只是改为“DEADPET”。
记忆太多了。 然后我想通过宠物名称订购。

我以为我可以创建一个代理变量,然后将其设置为一个宠物名称 只有在宠物还活着的情况下,例如。

DECLARE      @petName nvarchar(18)
SELECT       @petName=(CASE LIF_STATUS='Alive' THEN PET_NAME ELSE 'DEADPET' END),
             PET_SPECIES,
             LIF_STATUS
FROM         PET
INNER JOIN   LIFE ON LIF_PET_PK=PET_PK
ORDER BY     @petName

但我不能这样做,TSQL不会允许它。

实际上,这与宠物无关,而且与金融贷款有关{肉丸生活!} 但原则是一样的。

1 个答案:

答案 0 :(得分:2)

我相信以下内容适合您(同时,结合您对变量赋值的错误修复):

SELECT       (CASE LIF_STATUS='Alive' THEN PET_NAME ELSE 'DEADPET' END) as `PET_NAME`
             PET_SPECIES,
             LIF_STATUS
FROM         PET
INNER JOIN   LIFE ON LIF_PET_PK=PET_PK
ORDER BY     `PET_NAME`