【问题标题】:SQL SELECT a value when it exists, otherwise populate a null value, multiple timesSQL SELECT 一个值存在时,否则填充一个空值,多次
【发布时间】:2013-05-03 14:25:02
【问题描述】:

我想选择两个绑定到表的值,如果它们不存在,则填充一个空值。但是,我只想要每条记录一行。如果我运行下面的查询,CASE 语句会创建重复的行。

SELECT DISTINCT YT.TITLE, YT.DETAILS,
CASE WHEN XT.ACOLUMN = 'CATEGORY' THEN XT.BCOLUMN END AS CATEGORY,
CASE WHEN XT.ACOLUMN = 'DIVISION' THEN XT.BCOLUMN END AS DIVISION 
FROM DB.YTABLE YT
LEFT OUTER JOIN DB.XTABLE XT
ON YT.ID_NUM = XT.ID_NUM

我想要的数据:

TitleExample1、DetailsExample1、Category1、Division1

TitleExample2, DetailsExample2, null, Division2

我得到的数据:

TitleExample1,DetailsExample1,Category1,空

TitleExample1, DetailsExample1, null, Division1

TitleExample1, DetailsExample1, null, null

TitleExample2, DetailsExample2, null, Division2

TitleExample2, DetailsExample2, null, null

我还尝试对同一个表使用多个表身份进行连接:

SELECT DISTINCT YT.TITLE, YT.DETAILS, XT1.BCOLUMN AS CATEGORY1, 
       XT2.BCOLUMN AS DIVISION 
LEFT OUTER JOIN DB.XTABLE XT1
ON YT.ID_NUM = XT.ID_NUM
LEFT OUTER JOIN DB.XTABLE XT2
ON YT.ID_NUM = XT.ID_NUM
 WHERE XT1.ACOLUMN = 'CATEGORY' AND
 XT2.ACOLUMN = 'DIVISION' 

如果同时填充了类别和部门值,则此方法效果很好。但是,如果标题和详细信息记录没有关联的类别或部门,则查询不会选择该记录。

我想要的数据:

TitleExample1、DetailsExample1、Category1、Division1

TitleExample2, DetailsExample2, null, Division2

我得到的数据:

TitleExample1、DetailsExample1、Category1、Division1

【问题讨论】:

  • 如果您发布表格的内容,如果您获得 3 行相同的标题,那将很有用,这是因为您至少有 3 行与您的 XTABLE 匹配。而且第一次查询不能得到这个结果:TitleExample1, DetailsExample1, Category1, Division1,因为XT.ACOLUMN不能同时等于CATEGORY和DIVISION

标签: sql select case


【解决方案1】:

您的第二种方法更好,但您必须在 OUTER JOIN 的 ON 语句中添加您的条件

SELECT DISTINCT YT.TITLE, YT.DETAILS, XT1.BCOLUMN AS CATEGORY1, XT2.BCOLUMN AS DIVISION 
FROM DB.YTABLE YT
LEFT OUTER JOIN DB.XTABLE XT1 ON (YT.ID_NUM = XT1.ID_NUM AND XT1.ACOLUMN = 'CATEGORY')
LEFT OUTER JOIN DB.XTABLE XT2 ON (YT.ID_NUM = XT2.ID_NUM AND XT2.ACOLUMN = 'DIVISION')

【讨论】:

  • 非常感谢!我刚刚尝试将附加条件添加到外部连接中并且有效。 G Mastros - 我没有时间尝试您的解决方案,但会在星期一。谢谢你们!
【解决方案2】:
SELECT YT.TITLE, YT.DETAILS,
Min(CASE WHEN XT.ACOLUMN = 'CATEGORY' THEN XT.BCOLUMN END) AS CATEGORY,
Min(CASE WHEN XT.ACOLUMN = 'DIVISION' THEN XT.BCOLUMN END) AS DIVISION 
FROM DB.YTABLE YT
LEFT OUTER JOIN DB.XTABLE XT
ON YT.ID_NUM = XT.ID_NUM
Group By YT.TITLE, YT.DETAILS

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    • 1970-01-01
    • 2018-08-06
    • 2021-10-15
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多