2016-03-20 42 views
1

甚至不确定nvl2是我应该使用的,但它似乎对我有意义。如果我可以让选择工作。下面的数据并不是真实的,但尽可能接近我想象中的对象:Oracle sql 11g - 一个nvl2函数可以包含一个select语句吗?

我试图用一个完整大小写的两个表和一个视图,但我不断收到'发生错误时发布' ,所以我想我会尝试没有任何测试数据....有两个表 - t1t2 - 它们包含'姓名','样式','颜色'和'门'的列。

..它们每个都有几行数据,其中一切都是平等的,有几行不匹配。如果'名字'和'门'都相等,我需要视图中的颜色是t1中的颜色。如果“名”和“门”不匹配,我需要在视图中的颜色读“橙色”

我试着用select语句确定的第一个值

创建视图中的select语句的 nvl2功能
nvl2(color, (select color from t1 where t1.style = t2.style and t1.doors = t2.doors), orange) 

可以通过一个nvl2函数包含一个select?我错了吗?如果是这样,我应该用什么来代替nvl2函数?

+0

谷歌搜索'nvsl'或'nvsl2'不返回任何有意义的东西。你可能是指'nvl2'? – Mureinik

+1

当然...所以编辑,,谢谢! – user761758

+0

您的预期产出是多少?一些示例数据会很好。 –

回答

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 
+0

Spot on ..左连接案件完成了..似乎是最容易混淆的方式来完成前进...当其他人必须看到同样的事情...... – user761758

1

我想你接近这个错误的方式。假设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相当于将​​3210,并使用它将使您的应用程序一点点更便携:

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

谢谢...并让它参与视图创作? – user761758

+0

@ user761758只需在'create view'语句中敲击这个select:'CREATE VIEW myview AS SELECT - etc ...'。 – Mureinik

相关问题