2013-03-01 14 views
5

Mam dość skomplikowany case oświadczenie, że pracuje w MySQL:Pisanie złożonej instrukcji case w Sequel?

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 

Jednak wszystkie próby napisać to w Sequel zawiodły. Używam tego jako szablonu:

Sequel.case([[:c, 1], [:d, 2]], 0) # (CASE WHEN "c" THEN 1 WHEN "d" THEN 2 ELSE 0 END) 

(od Jeremy Evans' Github)

Mój najlepszy przypuszczenie byłoby:

dataset.select(# rest of code omitted... 
[[(:code => 'a'), 'x'], 
[(:code => 'b'), 'y'], 
[(:class => ['p', 'q'], :amount < 0), 'z']].case(nil).as(:status)) 

pomysłów?

+2

Czy zapytałeś w [Sequel-talk] (https://groups.google.com/forum/?fromgroups#!forum/sequel-talk)? To tam spędzają czas Jeremy Evans i guru. –

Odpowiedz

3

Po zabawie doszedłem do wniosku, że chociaż sequelowy klejnot ma być "prosty, elastyczny i mocny", jego składnia staje się dość skomplikowana, gdy sprawy stają się nieco skomplikowane.

Oto moja najlepsza próba zapytanie:

DB[:testtable].select( 
    Sequel.case([ 
    [{code: 'a'}, 'x'], 
    [{code: ['m', 'n']}, 'y'], 
    [{class: ['p', 'q'], (Sequel.expr(:amount) > 0) => true}, 'z']], 
    nil). 
    as(:status) 
) 

To daje następujące (niemal prawidłowe) SQL:

SELECT (
CASE WHEN (`code` = 'a') THEN 'x' 
WHEN (`code` IN ('m', 'n')) THEN 'y' 
WHEN ((`class` IN ('p', 'q')) AND ((`amount` > 0) IS TRUE)) THEN 'z' 
ELSE NULL END) AS `status` FROM `testtable` 

Nie mogłem dowiedzieć się, jak użyć operatora nierówności wewnątrz Oświadczenie sprawy. Może będziesz miał więcej szczęścia z tym.

Moja sugestia jest taka, że ​​wystarczy napisać zapytanie w języku SQL, będzie ono znacznie łatwiejsze do odczytania i łatwiejsze w utrzymaniu.

+0

Dziękuję za twoje bóle! Jestem skłonny zgodzić się z twoim ostatnim stwierdzeniem - chociaż starałem się napisać wszystko w Sequel dla dokładności, nic nie jest tak czytelne jak oryginał. – user1706938

Powiązane problemy