4

我需要编写一些 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”代替。
太多的回忆。然后我想按宠物名称订购。

我以为我可以创建一个代理变量,然后仅在宠物还活着的情况下在 case 语句中将其设置为宠物名,例如

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 不允许。

当然,实际上这与 Pets 无关,都是与金融贷款 {Meatball Lives!} 有关,但原理是一样的。

4

1 回答 1

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`
于 2013-03-19T11:15:56.447 回答