【问题标题】:Oracle sql 11g - Can an nvl2 function include a select statement?Oracle sql 11g - nvl2 函数可以包含选择语句吗?
【发布时间】:2016-07-07 03:41:43
【问题描述】:

甚至不确定nvl2 是我应该使用的,但对我来说似乎很有意义。如果我能让选择工作。下面的数据不是实际的,但与想象的对象一样接近:

我尝试使用包含两个表和一个视图的完整案例发布此内容,但我一直收到“发布时发生错误”,所以我想我会尝试不使用任何测试数据...。有两个表 - t1t2 -- 包含“名称”、“样式”、“颜色”和“门”列。

.. 它们每个都有几行数据,其中所有内容都相等,并且有几行不匹配。如果“名称”和“门”都相等,我需要视图中的颜色与 t1 中的颜色相同。如果“名称”和“门”不匹配,我需要视图中的颜色读取“橙色”

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

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

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

【问题讨论】:

  • 谷歌搜索 nvslnvsl2 不会返回任何有意义的信息。你可能指的是nvl2吗?
  • 当然...如此编辑,谢谢!!
  • 您的预期输出是什么?一些样本数据会很好。
  • 有点含糊,但是左连接和 case 语句不可以在这里选择使用哪种颜色吗?
  • 我有一个案例,但无法将其包含在原始问题中...

标签: sql select oracle11g nvl


【解决方案1】:

您想要实现的目标有点模糊,但这可能会奏效:

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 的顺序,因为您可能不太清楚您想从哪个表中提取行集

您只需要一个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

【讨论】:

  • 发现.. 左连接与案例完成了.. 似乎是最不令人困惑的方式来完成它......当其他人必须看到同样的事情时...... ..
【解决方案2】:

我认为您以错误的方式处理此问题。假设 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

【讨论】:

  • 谢谢...并让它参与视图创建?
  • @user761758 只需在create view 语句中添加这个选择:CREATE VIEW myview AS SELECT -- etc...
猜你喜欢
  • 2015-08-28
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 2015-01-28
  • 1970-01-01
相关资源
最近更新 更多