返回空行时的情况

时间:2016-04-15 21:19:05

标签: sql oracle

以下是我的表格:

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。

3 个答案:

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

说明:

  • 此查询中并不真正需要表t1,但我想这是在您的真实查询中,所以我保留了它。
  • 您的加入语法已过时超过二十年,不应再使用。我用适当的显式连接替换它。
  • 单引号用于字符串文字。请改为使用双引号作为别名。
  • Oracle通常区分大小写。我很惊讶like 'app%'适合你。我认为应该是t2.a like 'App%'lower(t2.a) like 'app%'

答案 2 :(得分:0)

根据您的更新信息,您需要左连接而不是内连接。

Broadcasts

这样可以显示所有3个ID,但只会显示右表上有苹果或胡萝卜的行,因为where条件会移动到连接中。