2013-03-01 14 views
5

Ho un piuttosto complesso case dichiarazione che funziona in MySQL:Scrivere una dichiarazione caso complesso in 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 

Tuttavia, tutti i tentativi di scrivere questo in Sequel hanno fallito. Sto usando questo come un modello:

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

(da Jeremy Evans' Github)

La mia ipotesi migliore sarebbe:

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

Tutte le idee?

+2

Avete chiesto su [Sequel-talk] (https://groups.google.com/forum/?fromgroups#!forum/sequel-talk)? È qui che si esibiscono Jeremy Evans e i guru. –

risposta

3

Dopo aver giocato con questo, ho concluso che, sebbene il sequel gem si proponga di essere "semplice, flessibile e potente", la sua sintassi diventa piuttosto complicata quando le cose diventano un po 'complicate.

Qui è il mio miglior tentativo di query:

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

Questo produce il seguente (quasi corretto) 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` 

non riuscivo a capire come utilizzare l'operatore di disuguaglianza all'interno di una dichiarazione di un caso. Forse avrai più fortuna con quello.

Il mio suggerimento è che basta scrivere la query in SQL, sarà molto più facile da leggere e più manutenibile.

+0

Grazie per i tuoi dolori! Sono propenso a concordare con la tua ultima affermazione - anche se avevo deciso di scrivere tutto in Sequel per completezza, nulla è più leggibile dell'originale. – user1706938

Problemi correlati