oracle 通过子查询包含一个case和排除它会得到不同数量的数据

rqenqsqc  于 2023-05-06  发布在  Oracle
关注(0)|答案(1)|浏览(145)

我在写一个查询来确定某人是否未成年。

select 
case when 
((select trunc((sysdate - to_date(customer.birthday)) / 365, 0) from dual) > 18)  then 'N' -- If the age is greater than 18, not a minor
else 'Y'
end as minor,
-- other columns.....
from database.customer cusomter

上面的查询给了我大约100个结果。但是,当我像下面这样从查询中排除该子句时,它会给我大约1000个结果。

select 
customer.birthday,
-- other columns.....
from database.customer

我试着在oracle中查找decode和case by之间的区别,我猜这与oracle处理null值的方式有关,但我真的不能把我的手指放在上面。任何帮助将不胜感激。谢谢大家!

ymdaylpp

ymdaylpp1#

你有错误:

  • cusomter别名拼写错误。
  • 每年没有365天,所以你的计算将是不正确的,可能会说某人不是未成年人,当他们仍然是。相反,您可以找到两个日期之间的月数。
  • 您不需要查询DUAL表(这不是错误的,只是不必要)。
SELECT CASE
       WHEN MONTHS_BETWEEN(SYSDATE, birthday) >= 18 * 12
       THEN 'N'-- If the age is greater than 18, not a minor
       ELSE 'Y'
       END as minor,
       -- other columns.....
FROM   database.customer

上面的查询给了我大约100个结果。但是,当我像下面这样从查询中排除该子句时,它会给我大约1000个结果。
SELECT子句中是否包含某些内容不会影响返回的行数;在上面的查询中删除CASE表达式不可能给您带来额外的结果。
如果你想改变返回的行数,那么你需要使用WHERE过滤器或JOIN过滤器。

相关问题