Oracle sql 11g - nvl2 函数可以包含 select 语句吗?

Oracle sql 11g - Can an nvl2 function include a select statement?

甚至不确定 nvl2 是我应该使用的,但它对我来说似乎有意义。如果我能让 select 工作。下面的数据不是实际的,而是我想象中的最接近的数据:

我尝试 post 使用两个表和一个视图的完整案例,但我一直得到 'an error occurred while posting',所以我想我会在没有任何测试数据的情况下尝试....那里有两个表 - t1t2 - 包含 'name'、'style'、'color' 和 'doors'.[=18= 的列]

.. 他们每个人都有几行数据,其中所有内容都相等,还有几行不匹配。如果 'name' 和 'doors' 都相等,我需要视图中的颜色是 t1 中的任何颜色。如果 'name' 和 'doors' 不匹配,我需要视图中的颜色显示 'orange'

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

nvl2(color, (select color from t1 where t1.style = t2.style and t1.doors = t2.doors), orange)

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

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

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

您可能需要更改 t1t2 的顺序作为连接,因为您不太清楚您希望从哪个 table 中提取行集

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

评论后编辑:

其实我觉得你在找这个逻辑,但我还是不清楚:

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

我认为您的处理方式有误。假设 t1t2 有 0:[0..1] 关系(我想他们必须有,或者这个问题没有多大意义),你选择的武器是left join,并在加入后应用 nvl,或达到那种效果(见下文):

SELECT    t2.*, NVL(t1.color, 'orange')
FROM      t2
LEFT JOIN t1 ON t1.style = t2.style AND t1.doors = t2.doors

请注意,nvl 是一个 Oracle 函数。 ANSI-SQL 等效项是 coalesce,使用它会使您的应用程序更便携:

SELECT    t2.*, COALESCE(t1.color, 'orange')
FROM      t2
LEFT JOIN t1 ON t1.style = t2.style AND t1.doors = t2.doors