我甚至不确定我应该使用的是nvl2,但这对我来说似乎是有意义的。如果我能让选择生效的话。下面的数据不是实际数据,而是尽可能接近想象对象的数据:
我试着用两个表和一个视图来发布这篇文章,但是我一直得到“发帖时出错”,所以我想我应该尝试不使用任何测试数据.有两个表-- t1和t2 --有“名称”、“样式”、“颜色”和“门”的列。
。。它们都有几行数据,其中所有数据都是相等的,也有几行不匹配。如果'name‘和'doors’都是相等的,我需要视图中的颜色是t1中的任何颜色。如果“名称”和“门”不匹配,我需要视图中的颜色来读“橙色”。
我尝试在视图select语句中创建一个nvl2函数,其中包含一个select语句来确定第一个值
nvl2(color, (select color from t1 where t1.style = t2.style and t1.doors = t2.doors), orange)nvl2函数可以包含select吗?我是否做错了,如果是的话,我应该用什么代替nvl2函数呢?
发布于 2016-03-20 18:03:46
你想要达到的目标有点模糊,但这可能会奏效:
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语句来实现您的选色逻辑。
评论后的编辑
我认为你是在寻找这种逻辑,但我仍然不清楚:
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-20 18:03:53
我觉得你走错路了。假设t1和t2之间有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的等价物是coalesce,使用它会使您的应用程序更具可移植性:
SELECT t2.*, COALESCE(t1.color, 'orange')
FROM t2
LEFT JOIN t1 ON t1.style = t2.style AND t1.doors = t2.doorshttps://stackoverflow.com/questions/36117352
复制相似问题