【发布时间】:2009-11-05 18:03:12
【问题描述】:
有没有办法重写使用 CASE WHEN 结构的 Transact SQL 语句来执行相同的操作而不使用 CASE WHEN?
我正在使用具有内置查询设计器和自己的伪 SQL 的产品。它对我可以与 SQL Server 和 Oracle 一起使用的内容有限制。所以我有这个专栏,当底层数据库是 Oracle 时,使用 DECODE(支持)。但是,我需要让它与 SQL Server 一起工作,并且不支持 CASE WHEN。
我要转换的语句类似于
Decode (StatusColumn, 'Value 1',
Decode(Sign(Now()-TargetDateColumn)),1,'Past
Due', 'Outstanding'), 'Value 2',
Decode(Sign(Now()-TargetDateColumn)),1,'Past
Due', 'Outstanding'), 'Value 3',
Decode(Sign(Now()-TargetDateColumn)),1,'Past
Due', 'Outstanding'), 'Value 4')
我有一组有限的 T-SQL 选项可供使用,CASE WHEN 不是一个选项。我确实有 IsNull 和 Coalesce,但我不确定他们是否会帮助我解决这个问题。
不用担心日期计算,这些都解决了。
我在这里搜索了 CASE WHEN 问题,但无济于事。
谢谢!
更新:
我意识到我应该详细说明限制的原因,因为这是开发人员的资源,并且会被假定为开发产品。不是。
我正在使用具有内置查询设计器和自己的伪 SQL 的企业软件产品。它对我可以与 SQL Server 和 Oracle 一起使用的内容有限制。基本上,所有不破坏内置查询引擎解析的东西都是游戏。这意味着所有批准的函数和表达式,加上所有数据抽象(对应于数据库中的物理表的内部对象和使用产品创建的其他查询),加上 Oracle SQL 或 Transact SQL 中没有显式破坏解析的所有内容.
CASE WHEN 对我不起作用的原因是它破坏了查询引擎对伪 SQL 的解析。
最终,我想尝试:
- 仅使用产品的查询 设计通过的 SQL 解析或
- 使用一些额外的资源 SQL Server 数据库和 查询设计器来完成它。
根据我得到的几个很好的答案,这是迄今为止对我有用的方法。
Jason DeFontes 建议我可以使用数据库视图来执行 CASE WHEN 规则,这属于上面的 #2。它对我有用,因为视图足够动态,我不必对其进行维护(与richartallent 的真值表方法相反,我认为它接近 Jason 的方法)。 Pascal 关于创建函数的建议也是如此,但可能会破坏解析。
所以我创建了一个数据库视图,它使用 CASE WHEN 进行所有转换,并将其添加到查询的 SQL 中,将其与现有 SQL 结合起来,它工作得很好。我意识到我可能会增加数据库引擎的开销,因为它必须检索相同的数据集两次(一次用于视图,一次用于查询),但这是几乎不成问题的情况之一。
鉴于这种“使用视图来混淆它”的设计对我来说很有效,我想知道什么是更有效的方法:
- 在 CASE WHEN 中使用选择;
- 使用 CTE(同样,richardtallent);
- 使用联合所有 (HLGEM);
- 使用子查询 (MisterZimbu);
我仍然会检查 Aramis wyler 的建议,因为它可能属于上述 #1。
目前,Jason 的回答已被接受。考虑到我在视图中使用了 CASE WHEN,也许问题的标题最终选择不当。我提高了每个人的建议,在这个过程中有所帮助。我不知道这是否会影响您的声誉,但我认为这是一件好事。
再次,我要感谢大家的帮助,并恳请您对您认为不合适的问题进行编辑(这是我的第一个问题,英语是我的第二语言)。
【问题讨论】:
-
我很好奇.. 为什么你没有使用 Case When 的选项?贵公司有这样的政策吗?!!?除非您有外部强制限制,否则 SQL Server 肯定支持 Case When。
-
可以,但查询工具可能不支持,将选择结果限制为表达式和函数调用。
-
这是我们正在开发的产品的限制。正如我所提到的,该产品有一个查询设计器和一个查询引擎以及它自己的 SQL,可以“翻译”/“足够”到 Oracle 或 SQL Server。我怀疑支持 decode 因为它是一个函数,无论我是否被告知 Case-When 不是一个函数,而是一个表达式。由于伪 SQL 定义,我认为 Case-When 会破坏查询引擎的解析。
-
在不确切知道您的第三方查询生成器的功能的情况下,我不相信您的问题可以得到解答。如果您指定[指定您正在使用的第三方工具,那么也许有该产品经验的人可能会为您提供帮助。
-
我想检查是否有使用子查询或联合之类的方法或它们的组合。感谢您的帮助。
标签: sql-server tsql case-when