我想将_BAR连接到Query的结果。
我的第一次尝试是:
SELECT lhs.f||rhs.f as concat_bar FROM (
SELECT 'FOO' as f FROM DUAL) lhs
LEFT JOIN
(
SELECT '_BAR' as f FROM DUAL) rhs
ON ('' != rhs.f)
;
但我没有结果。我期待ON ('' != rhs.f)
评估为true
,因此我预计会产生一行:'FOO_BAR'
。这是连接lhs和rhs表的笛卡尔积的结果。
我怎样才能JOIN on TRUE
?
我知道,对于具体问题,其他解决方案为
SELECT lhs.f||'_BAR' FROM (
SELECT 'FOO' as f FROM DUAL) lhs;
是可能的。
我的问题是有效的语法,将两个表的笛卡尔积作为LEFT JOIN ON TRUE
。
答案 0 :(得分:2)
Oracle(默认情况下)将空字符串视为NULL
。这是一个真正的痛苦。它与其他数据库不同。我想他们的论点是:“好吧,在ANSI定义NULL
值之前,我们已经做了多年。”很棒,但那些年是20世纪80年代。
无论如何,这个逻辑:
'' <> rhs.f
(<>
是SQL中的原始not-equals运算符。)
与:
完全相同NULL <> rhs.f
这始终会返回NULL
,并且在WHERE
条件中被视为不为真。
在Oracle中,将此空虚表达为:
rhs.f is not null
答案 1 :(得分:1)
除了null
的问题之外,还有你想要的交叉加入吗?
select lhs.f || rhs.f as concat_bar
from ( select 'FOO' as f from dual ) lhs
cross join
( select '_BAR' as f from dual ) rhs