SQL根据条件执行不同的语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL根据条件执行不同的语句相关的知识,希望对你有一定的参考价值。

有这样的一个SOL语句
select w.WorkloadID,p.ProcessName,F.FlowName,D.District_Name,w.AreaCode,W.SCadastralNumber,W.ECadastralNumber,W.WE_Name,W.W_Name,W.GroupWork,W.STime,W.Days,W.ETime,F.FlowName,F.DayWorks,W.Days,W.Days*F.DayWorks as DayWorks,convert(decimal(18,2),W.GroupWork-(W.Days*F.DayWorks)) as DeductDayW,convert(decimal(18,2),W.GroupWork-(W.Days*F.DayWorks)*P.P_Ratio,2) as Yield
from Workload W left join District D on W.District_ID=D.District_Num
Left join Process p on w.ProcessID=p.ProcessID
left join Flow F on w.FlowID=F.FlowID
我想显示的条件是如果F.FlowID=‘-1’那么convert(decimal(18,2),W.GroupWork-(W.Days*F.DayWorks)*P.P_Ratio,2) as Yield执行这个,如果不等于-1那么就执行这个
convert(decimal(18,2),W.GroupWork-(W.Days*F.DayWorks)*F.F_Ratio,2) as Yield
求大神啊

select w.WorkloadID,
p.ProcessName,
F.FlowName,
D.District_Name,
w.AreaCode,
W.SCadastralNumber,
W.ECadastralNumber,
W.WE_Name,
W.W_Name,
W.GroupWork,
W.STime,
W.Days,
W.ETime,
F.FlowName,
F.DayWorks,
W.Days,
W.Days*F.DayWorks as DayWorks,
convert(decimal(18,2),W.GroupWork-(W.Days*F.DayWorks)) as DeductDayW,
case when F.FlowID=\'-1\' then convert(decimal(18,2),W.GroupWork-(W.Days*F.DayWorks)*P.P_Ratio,2) else convert(decimal(18,2),W.GroupWork-(W.Days*F.DayWorks)*F.F_Ratio,2) end as Yield
from Workload W left join District D on W.District_ID=D.District_Num 
Left join Process p on w.ProcessID=p.ProcessID 
left join Flow F on w.FlowID=F.FlowID

看看是这个意思吗?

追问

对,就是这个意思,谢谢了

参考技术A case when F.FlowID=‘-1’
then convert(decimal(18,2),W.GroupWork-(W.Days*F.DayWorks)*P.P_Ratio,2) else
when F.FlowID<>‘-1’
convert(decimal(18,2),W.GroupWork-(W.Days*F.DayWorks)*F.F_Ratio,2) end as Yield

根据条件执行不同的函数而不使用if语句

是否有更好的方法/编码风格在不使用if语句的情况下在不同条件下执行不同的函数?

我在JavaScript中使用以下方式进行编码:(例如,不同条件下的函数可能使用API​​中的不同fetch方法)

if(answer == 'a'){
  foo()

if(answer == 'b'){
  bar()

if(answer == 'c'){
  bar_2()

if(answer == 'd'){
  foo_3()

我曾想过使用eval(),但这是一个好方法吗?例如,创建对象由作为条件的键和作为属性的函数名组成。

conditions:{
  a: 'foo',
  b: 'bar',
  c: 'foo_2',
  d: 'bar_2',
}

eval(this.conditions[a])一样运行它

但我也听说使用eval很难进行测试。

答案

是的,您可以使用该函数构建条件对象并调用它们:

function foo(){...}
function bar(){...}

var conditions : {
    'a': foo,
    'b': bar,
}

conditions[answer]()

注意:如果您不知道自己在做什么,请尽量不要使用eval它有安全隐患

另一答案

您使用键指向功能标识符。你最好用key来指向函数:

conditions:{
  a: () => {
    // body of foo
  },
  b: () => {
    // body of bar
  },
  c: () => {
    // body of foo_2
  },
  d: () => {
    // body of bar_2
  }
}

conditions[ your_key ]();
另一答案

您可以定义对函数的引用或在每个条件下执行

const doSomething = (args) => {
    // do something
}
const doSomethingElse = (args) => {
    // do something else
}

const conditions = {
    a: doSomething,
    b: doSomethingElse
};

// and then
const result = conditions[answer](params);

甚至是功能参考列表

const conditions = {
    a: [
        doSomething,
    ],
    b: [
        doSomething,
        doSomethingElse
    ]
};
// and then
const results = conditions[ answer ].map(method => method());
另一答案

你可以创建这样的函数:

this['some answer'] = function() {...}

然后称之为

this[answer]()

以上是关于SQL根据条件执行不同的语句的主要内容,如果未能解决你的问题,请参考以下文章

sql 存储过程 - 根据条件执行不同的SQL语句

sql语句 根据条件的不同让where后的赛选条件动态改变

mysql根据条件执行sql

mysql中sql语句查询的同时根据条件将数据插入到另一个表的做法?

sql语句查询,根据一个表中一个列,该列在两个不同条件同时满足的查询结果

根据表数据有条件地执行 SQL 查询/语句