以下是我的表格:
T1:
ID
1
2
3
T2:
ID (fk) value
1 Apple
1 Chocolate
2 Carrot
2 Chocolate
3 Candy
3 Chocolate
在我的查询中:
select t1.id,
case when (t2.a) like 'app%'
then 'Apple'
end as 'Fruits',
case when (t2.a) like 'car%'
then 'Carrot'
end as 'Veggies'
from t1, t2
where t1.id = t2.id
以下是我的输出结果:
id Fruits Veggies
=====================
1 Apple
1
2 Carrot
2
3
我看到在输出中,我得到两行,一行有匹配'水果'素食'和一个null
。
为什么查询返回空行?
对不起,如果我的例子不是很好。基本上我正在尝试使用一些文本标识符创建另外两列。
我期待输出如下:
id Fruits Veggies
=====================
1 Apple
2 Carrot
3
编辑: 我在上面添加了表结构,并使用from和where子句更新了查询。在where子句中实现条件之后,我意识到如果我在where子句中有所述条件,则不会返回没有像#3这样的Apple或Carrot的ID。
答案 0 :(得分:1)
注意:我最初误解了这个问题,并假设您正在尝试替换提供结果的行中找到的值旁边的空值。这就是我建议包括ELSE的原因。我更改了示例以在WHERE子句中包含过滤器,因此您不会获得既没有app%也没有car%的行。
示例:
select t1.id,
case when (t1.a) like 'app%' then 'Apple'
end as 'Fruits'
case when (t1.a) like 'car%' then 'Carrot'
end as 'Veggies'
where t1.a like 'app%' or t1.a like 'car%'
答案 1 :(得分:0)
您将获得不想要的结果行。在WHERE
子句中排除它们:
where t1.a like 'app%' or t1.a like 'car%'
更新:您已更新了问题,并希望显示结果中没有的ID 3。仍然没有显示FROM和WHERE子句。如果您要显示一行,但尚未显示,那么您现有的WHERE子句限制性太强,或者您正在使用内连接,而您希望进行外部连接。
UPDATE2:现在您再次更新了显示表格结构和内容的请求,它表明您实际需要两个查询结果:苹果和胡萝卜(这是一个非聚合查询)加上每个ID既不具有一个也不另一个的记录(这是一个聚合;您查看所有ID的记录以确定条件是否为真)。您将这两个查询与UNION ALL
粘合在一起。
select
t2.id,
case when t2.a like 'App%' then 'Apple' end as "Fruits",
case when t2.a like 'Car%' then 'Carrot' end as "Veggies"
from t2
join t1 on t1.id = t2.id
where t2.a like 'App%' or t2.a like 'Car%'
union all
select id, null, null
from t2
group by id
having max(case when a like 'App%' or a like 'Car%' then 1 else 0 end) = 0;
说明:
like 'app%'
适合你。我认为应该是t2.a like 'App%'
或lower(t2.a) like 'app%'
。答案 2 :(得分:0)
根据您的更新信息,您需要左连接而不是内连接。
Broadcasts
这样可以显示所有3个ID,但只会显示右表上有苹果或胡萝卜的行,因为where条件会移动到连接中。