我有一个在MySQL中工作的相当复杂的case
语句:
SELECT # rest of code omitted
CASE WHEN code = 'a' THEN 'x'
WHEN code IN ('m', 'n') THEN 'y'
WHEN class IN ('p', 'q') AND amount < 0 THEN 'z'
ELSE NULL END AS status
FROM # rest of code omitted
然而,所有试图在Sequel中写入此内容的尝试都失败了。我把它作为一个模板:
Sequel.case([[:c, 1], [:d, 2]], 0) # (CASE WHEN "c" THEN 1 WHEN "d" THEN 2 ELSE 0 END)
(from Jeremy Evans' Github)
我最好的猜测是:
dataset.select( # rest of code omitted...
[[(:code => 'a'), 'x'],
[(:code => 'b'), 'y'],
[(:class => ['p', 'q'], :amount < 0), 'z']].case(nil).as(:status))
有什么想法吗?
2条答案
按热度按时间3ks5zfa01#
在玩过这个之后,我得出的结论是,尽管续集gem的目标是“简单,灵活和强大”,但当事情变得有点棘手时,它的语法变得相当复杂。
以下是我对您的查询的最佳尝试:
这将产生以下(几乎正确的)SQL:
我不知道如何在case语句中使用不等式运算符。也许你会有更多的运气。
我的建议是,你只需要用SQL编写查询,它会更容易阅读,更容易维护。
u3r8eeie2#
由于这是谷歌搜索复杂的续集案例声明时的最高职位,这里有一个答案,我认为比其他答案更干净。