1

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

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

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

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

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

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

4

2 回答 2

1

我认为您以错误的方式处理此问题。假设t1并且t2有 0:[0..1] 关系(我猜他们必须有,或者这个问题没有多大意义),你选择的武器将是 a 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
于 2016-03-20T18:03:53.477 回答
0

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

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
于 2016-03-20T18:03:46.117 回答