首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OracleSQL11g-- nvl2函数可以包含select语句吗?

问OracleSQL11g-- nvl2函数可以包含select语句吗?
EN

Stack Overflow用户
提问于 2016-03-20 17:54:13
回答 2查看 878关注 0票数 1

我甚至不确定我应该使用的是nvl2,但这对我来说似乎是有意义的。如果我能让选择生效的话。下面的数据不是实际数据,而是尽可能接近想象对象的数据:

我试着用两个表和一个视图来发布这篇文章,但是我一直得到“发帖时出错”,所以我想我应该尝试不使用任何测试数据.有两个表-- t1和t2 --有“名称”、“样式”、“颜色”和“门”的列。

。。它们都有几行数据,其中所有数据都是相等的,也有几行不匹配。如果'name‘和'doors’都是相等的,我需要视图中的颜色是t1中的任何颜色。如果“名称”和“门”不匹配,我需要视图中的颜色来读“橙色”。

我尝试在视图select语句中创建一个nvl2函数,其中包含一个select语句来确定第一个值

代码语言:javascript
复制
nvl2(color, (select color from t1 where t1.style = t2.style and t1.doors = t2.doors), orange)

nvl2函数可以包含select吗?我是否做错了,如果是的话,我应该用什么代替nvl2函数呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-20 18:03:46

你想要达到的目标有点模糊,但这可能会奏效:

代码语言:javascript
复制
SELECT
  t1.*,
  CASE WHEN t2.name is not null THEN t1.color ELSE 'orange' END as color
FROM
  t1
  LEFT JOIN t2 ON
    t1.name = t2.name
    AND t1.doors = t2.doors

您可能需要更改t1和t2的顺序,因为joins是考虑的,因为还不清楚要从哪个表中提取行集

您只需要一个LEFT JOIN和一个CASE语句来实现您的选色逻辑。

评论后的编辑

我认为你是在寻找这种逻辑,但我仍然不清楚:

代码语言:javascript
复制
SELECT
  t1.*,
  CASE WHEN t1.doors = t2.doors and t1.style = t2.style and t1.color = t2.color THEN t1.color ELSE 'orange' END as color
FROM
  t1
  LEFT JOIN t2 ON
    t1.name = t2.name
票数 0
EN

Stack Overflow用户

发布于 2016-03-20 18:03:53

我觉得你走错路了。假设t1和t2之间有0:0.1的关系(我猜它们一定有关系,或者这个问题没有多大意义),那么您选择的武器将是left join,并在加入之后应用nvl或类似的东西(参见下面):

代码语言:javascript
复制
SELECT    t2.*, NVL(t1.color, 'orange')
FROM      t2
LEFT JOIN t1 ON t1.style = t2.style AND t1.doors = t2.doors

注意,nvl是一个Oracle函数。ANSI的等价物是coalesce,使用它会使您的应用程序更具可移植性:

代码语言:javascript
复制
SELECT    t2.*, COALESCE(t1.color, 'orange')
FROM      t2
LEFT JOIN t1 ON t1.style = t2.style AND t1.doors = t2.doors
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36117352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档