Add fn-handler for CASE statement
This commit is contained in:
parent
7001826d4b
commit
b51611d4d6
2 changed files with 36 additions and 0 deletions
|
|
@ -523,3 +523,13 @@
|
|||
|
||||
(defmethod format-clause :union-all [[_ maps] _]
|
||||
(string/join " UNION ALL " (map to-sql maps)))
|
||||
|
||||
(defmethod fn-handler "case" [_ & clauses]
|
||||
(str "CASE "
|
||||
(space-join
|
||||
(for [[condition result] (partition 2 clauses)]
|
||||
(if (= :else condition)
|
||||
(str "ELSE " (to-sql result))
|
||||
(let [pred (format-predicate* condition)]
|
||||
(str "WHEN " pred " THEN " (to-sql result))))))
|
||||
" END"))
|
||||
|
|
|
|||
|
|
@ -127,3 +127,29 @@
|
|||
:from [:customers]
|
||||
:where [:in :id :?ids]}
|
||||
{:ids values})))))))
|
||||
|
||||
(deftest test-case
|
||||
(is (= ["SELECT CASE WHEN foo < 0 THEN -1 WHEN (foo > 0 AND (foo mod 2) = 0) THEN (foo / 2) ELSE 0 END FROM bar"]
|
||||
(sql/format
|
||||
{:select [(sql/call
|
||||
:case
|
||||
[:< :foo 0] -1
|
||||
[:and [:> :foo 0] [:= (sql/call :mod :foo 2) 0]] (sql/call :/ :foo 2)
|
||||
:else 0)]
|
||||
:from [:bar]})))
|
||||
(let [param1 1
|
||||
param2 2
|
||||
param3 "three"]
|
||||
(is (= ["SELECT CASE WHEN foo = ? THEN 0 WHEN foo = bar THEN ? WHEN bar = 0 THEN (bar * ?) ELSE ? END FROM baz"
|
||||
param1 param2 param3 "param4"]
|
||||
(sql/format
|
||||
{:select [(sql/call
|
||||
:case
|
||||
[:= :foo :?param1] 0
|
||||
[:= :foo :bar] (sql/param :param2)
|
||||
[:= :bar 0] (sql/call :* :bar :?param3)
|
||||
:else "param4")]
|
||||
:from [:baz]}
|
||||
{:param1 param1
|
||||
:param2 param2
|
||||
:param3 param3})))))
|
||||
|
|
|
|||
Loading…
Reference in a new issue