0

为了使一些新模式与旧模式相匹配,我不得不做一些我认为可以以更好的方式完成的丑陋扭曲。作为参考,我在这里询问了有关此匹配过程的另一个问题:从相关子表创建视图

我在SQLFiddle中放置了一个简化的示例,但它的要点是,我可以看到协调这两个不同模式的唯一方法是对相同的值执行两个 case 语句,如下所示:

SELECT 
    CASE 
        WHEN n.FooBarStatusId = 1 OR n.FooBarStatusId = 2 
            THEN 1 
        ELSE 0 
    END as [IsFoo],
    CASE
        WHEN n.FooBarStatusId = 2
            THEN 1
        ELSE 0
    END as [IsBar]
from Parent p
left join OldStuff o on p.ParentId = o.ParentId
left join NewStuff n on p.ParentId = n.ParentId

有没有更好和/或更有效的方法来完成同样的事情?在给定的查询中,这些案例语句可能会被命中数百次,我担心这个特定的逻辑。

我考虑过将这个特定逻辑(它是构建视图的更大查询的一部分)提取到临时表甚至是表值函数中,但即使我仍然无法想出使用的方法多个案例陈述。

4

2 回答 2

1

刚刚改正语法...

我找到了另一个解决方案:

select 
 p.Name,
 ISNULL(o.IsFoo, CONVERT(BIT, n.FooBarStatusId)) as [IsFoo],
 ISNULL(o.IsBar, CONVERT(BIT, n.FooBarStatusId * (n.FooBarStatusId - 1))) as [IsBar],
from Parent p
left join OldStuff o on p.ParentId = o.ParentId
left join NewStuff n on p.ParentId = n.ParentId

唯一的一种算术解决方案可能很慢:

select 
 p.Name,
 ISNULL(o.IsFoo, CAST( (n.FooBarStatusId % 0.35) * 4 AS int)) AS [IsFoo],
 ISNULL(o.IsBar, n.FooBarStatusId/2) [IsBar]
from Parent p
left join OldStuff o on p.ParentId = o.ParentId
left join NewStuff n on p.ParentId = n.ParentId

个人不喜欢用除法,因为会涉及到浮点运算,那样会很慢。

于 2014-01-24T00:41:04.987 回答
1

由于您有两列,因此您需要两个表达式……但它们可能不必是CASE表达式。阅读您的问题,我得到的印象是该列中唯一可能的值是 0、1、2,这是一种int类型?如果这是正确的,您可以使用算术而不是布尔逻辑来获得您需要的东西。尝试这个:

CAST( (n.FooBarStatusId % .35) * 4 AS int) AS [IsFoo],
n.FooBarStatusId/2 [IsBar]
于 2013-09-16T22:35:22.173 回答