Sql 合并或案例更有效和/或更标准
就x和y而言Sql 合并或案例更有效和/或更标准,sql,standards,sql-standards,Sql,Standards,Sql Standards,就x和y而言 x是否更符合sql标准?[如果主观,请道歉] x比y更有效吗 或者这些脚本完全不同,可以在不同的上下文中使用 x y COALESCE本质上是一种速记CASE语句 两者完全相同 SQL Server中也有ISNULL(与其他DBMS不同),但这实际上是一个非标准特性,实际上比COALESCE更为有限,在这种情况下,我将使用COALESCE(它提供的级别比ISNULL)而不是case语句 CASE语句在这里似乎有点笨重,因为您只检查NULLs。我认为COALESCE还可以生成更可
- x是否更符合sql标准?[如果主观,请道歉]
- x比y更有效吗
- 或者这些脚本完全不同,可以在不同的上下文中使用
COALESCE
本质上是一种速记CASE
语句
两者完全相同
SQL Server中也有
ISNULL
(与其他DBMS不同),但这实际上是一个非标准特性,实际上比COALESCE
更为有限,在这种情况下,我将使用COALESCE
(它提供的级别比ISNULL
)而不是case
语句
CASE
语句在这里似乎有点笨重,因为您只检查NULL
s。我认为COALESCE还可以生成更可读的代码,并且更易于移植IIRC。实际上,isnull在不同的数据库中有不同的名称。在甲骨文中是nvl。在redbrick中,它是ifnull。这可能就是你所说的非标准。@DanBracuk是的,这就是我的意思,我解释得很清楚。ISNULL
不是标准,所以我没有使用它,也许是主观的,但关注哪个“更标准”似乎是矛盾的在流体数据库设计中,联接列根据列是否包含空值而更改。这种加入对我来说是危险的。从表面上看,这是一种脆弱的设计。@Tim-如果你把它作为一个答案来添加,会更有建设性-充分解释你的“危险信号”和“脆弱的设计”顾虑…我理解a
和b
中应该避免null
:但这是一个完全不同的主题!如果我回答这个问题,它将被否决,我将被谴责它应该是一个注释:-)解释:表B有两列外键指向表a中的一列。当列位于外键关系的子表中时,允许列为NULL值是可以接受的。在表中有两个这样的列,都允许空值,并指向同一父表中的同一列,这表明发生了非规范化,这是非标准的。@Tim感谢您的解释;这不是我的db-我只是想用标准的方式审问它
SELECT *
FROM a
INNER JOIN b ON
COALESCE(b.columntojoin, b.alternatecolumn) = a.columntojoin
SELECT *
FROM a
INNER JOIN b ON
(case when b.columntojoin is null then b.alternatecolumn else b.columntojoin end) = a.columntojoin