Oracle sql 11g - nvl2 函数可以包含 select 语句吗?
Oracle sql 11g - Can an nvl2 function include a select statement?
甚至不确定 nvl2
是我应该使用的,但它对我来说似乎有意义。如果我能让 select 工作。下面的数据不是实际的,而是我想象中的最接近的数据:
我尝试 post 使用两个表和一个视图的完整案例,但我一直得到 'an error occurred while posting',所以我想我会在没有任何测试数据的情况下尝试....那里有两个表 - t1
和 t2
- 包含 '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
您可能需要更改 t1
和 t2
的顺序作为连接,因为您不太清楚您希望从哪个 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
我认为您的处理方式有误。假设 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-SQL 等效项是 coalesce
,使用它会使您的应用程序更便携:
SELECT t2.*, COALESCE(t1.color, 'orange')
FROM t2
LEFT JOIN t1 ON t1.style = t2.style AND t1.doors = t2.doors
甚至不确定 nvl2
是我应该使用的,但它对我来说似乎有意义。如果我能让 select 工作。下面的数据不是实际的,而是我想象中的最接近的数据:
我尝试 post 使用两个表和一个视图的完整案例,但我一直得到 'an error occurred while posting',所以我想我会在没有任何测试数据的情况下尝试....那里有两个表 - t1
和 t2
- 包含 '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
您可能需要更改 t1
和 t2
的顺序作为连接,因为您不太清楚您希望从哪个 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
我认为您的处理方式有误。假设 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-SQL 等效项是 coalesce
,使用它会使您的应用程序更便携:
SELECT t2.*, COALESCE(t1.color, 'orange')
FROM t2
LEFT JOIN t1 ON t1.style = t2.style AND t1.doors = t2.doors