SQL服务器的情况时,不使用时的情况
-
18-09-2019 - |
题
有没有办法改写的Transact SQL声明使用的情况时结构的做相同而无需使用的情况下什么时候?
我使用的一种产品,有一个内在查询的设计师及其自己的伪SQL。它具有局限性是什么,我可以使用与SQL服务器和甲骨文。所以我有此列,当基础Oracle数据库,使用译码(其是支持)。然而,我需要使其工作与SQL服务器和时的情况是不支持的。
声明我试图转换成是喜欢的东西
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的选择来使用的情况下时不是一个选项。我有函数和聚结在一起,但我不知道如果他们将帮助我这一个。
不要理会的日期计算,这些都解决了。
我搜索的情况时,问题在这里,无济于事。
谢谢!
更新:
我意识到我应该给的更多细节上的原因的限制,因为这是一个开发的资源,这将是假设这是一个发展的产品。它不是。
我使用一个企业软件产品,有一个内置查询的设计师及其自己的伪SQL。它具有局限性是什么,我可以使用与SQL服务器和甲骨文。基本上,一切不断分析的内在查询的动机是游戏。这意味着所有受制裁的功能和表达,再加上所有的数据的抽象(内部的对象,对应于物理数据库中的表和其他查询,创建产品),再加上一切从Oracle SQL或交易SQL,没有明确断的分析。
为什么情况下,当不为我工作的是它打破分析的伪SQL通过查询的引擎。
最后,我想尝试:
- 只使用该产品的查询 设计师SQL通过 分析或
- 使用一些额外的资源 SQL服务器数据库和 查询的设计师把它完成。
基于若干很好的答案,我到了,这里的方法,作出对我来说,为止。
杰森DeFontes建议,我可以用一个数据库查看执行情况时的规则并落入#2以上。这对我的作品的,因为一个观点是动态的,我没有做到维护它的(相对于richartallent的事实表的方法,我相信是附近的杰森的方法)。Pascal的建议创建一种功能会沿着相同的路线,但可能打破的分析。
所以我建立了一个数据库,认为所有转换的情况下,当我加入到我查询的SQL,加入了与现有的SQL和它的工作就好了。我意识到我可能增加开销的数据库引擎,因为它将必须检索相同的数据集的两次(一个用于查看,一个用于查询),但是它的这些情况下,它几乎没有一个问题。
鉴于这"使用图混淆它的"设计对我的作品,我不知道什么是更有效的方法:
- 使用选择时的情况;
- 使用CTE(再次richardtallent);
- 使用联盟的所有(HLGEM);
- 使用子查询(MisterZimbu);
我仍然会检查阿拉密斯怀勒的建议,因为它可能落入#1。
现在杰森的答案被接受。考虑到我使用情况当中查看,也许标题的问题,结束了被虐待的选择。我调升了大家,建议东西,帮助在这一进程。我不知道如果让一个差别在你的名声或不,但我认为这是很好的事情要做。
再次,我要感谢你所有你的帮助,并请你请到任何编辑上的问题,你倒是不适当的(这是我的第一个问题,英语是我的第二语言)。
解决方案
你可以移动的情况下/当的逻辑进图,然后有的工具查询的观点?
其他提示
你有联盟所有可用的?也许你可以写查询每一条件与条件的情况下在其中的条款和联合在一起。
你可以写入定义的子查询?可能不如果你甚至没有访问时的情况,但是这将可能的工作:
select
...,
coalesce(c1.value, c2.value, c3.value, ..., <default value>)
from MyTable
left join (select <result 1> as value) c1 on <first condition>
left join (select <result 2> as value) c2 on <second condition>
left join (select <result 3> as value) c3 on <third condition>
写一个函数进行计算使用情况的时候。
它丑恶的和根据数值有可能不是可行的。但严格地说,我认为像这样的东西会的工作作为一个翻译从上面查询段:
选择'PastDue'from tablename现在在哪里()>TargetDateColumn和(StatusColumn='1'或StatusColumn='Value2'或StatusColumn='3') 联盟选择"优秀"现在在哪里() < TargetDateColumn和(StatusColumn='1'或StatusColumn='Value2'或StatusColumn='3') 联盟选择价值4'不(StatusColumn='1'或StatusColumn='Value2'或StatusColumn='3')
我不确定我理解你的代码,但是这应该给你一个想法不同的方法。
第一,创建一个表:
CREATE TABLE StatusLookup(
value nvarchar(255),
datesign shortint,
result varchar(255));
现在填充这一事实表(很多重复的逻辑在这里显然是,也许这应该是两个真值表与横加入它们之间):
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 1', -1, 'Outstanding')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 1', 0, 'Outstanding')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 1', 1, 'Past Due')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 2', -1, 'Outstanding')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 2', 0, 'Outstanding')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 2', 1, 'Past Due')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 3', -1, 'Outstanding')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 3', 0, 'Outstanding')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 3', 1, 'Past Due')
最后,加入和提供默认的回答:
SELECT mytable.*, COALESCE(statuslookup.result, 'Value 4')
FROM
mytable LEFT JOIN statuslookup ON
statuslookup.value = StatusColumn
AND statuslookup.datesign = Sign(Now()-TargetDateColumn)
一个关键的优势,这种方法是把业务逻辑数据表,而不是代码,这往往更容易维护和扩展。