Clojure JDBC странный ответ на сумму - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь выполнить простое суммирование сумм двух запросов на количество:

(jdbc/query (db-connection)
        "SELECT sum(t.count) AS count FROM (select 1 AS count union select 2 AS count) t")
=> ({:count 3})

(jdbc/query (db-connection)
        "select count(1) from table_a")
=> ({:count 0})

(jdbc/query (db-connection)
        "select count(1) from table_b")
=> ({:count 0})

(jdbc/query (db-connection)
        "SELECT sum(t.count) AS count FROM (select count(1) from table_a union select count(1) from table_b) t")
=> ({:count 0M})

0M

Почему 0M? Почему м? Что происходит?

EDIT2: Это нотация BigDecimal. Я все еще хотел бы знать, почему это внезапно использует BigDecimal. sum трактуется по-другому в JDBC? Возвращает ли db (postgres) другой тип данных для sum?

EDIT 3: Postgres возвращает общий тип numeric для суммирования. Это преобразуется в BigDecimal в JDBC.

Таким образом, другой способ последовательного получения возвращаемого значения одного и того же типа состоит в приведении в запросе:

(jdbc/query (db-connection)
    "SELECT sum(t.count)::bigint AS count FROM (select count(1) from table_a union select count(1) from table_b) t")
=> ({:count 423602})

1 Ответ

1 голос
/ 31 октября 2019

Как я уже говорил, это нотация BigDecimal. Вы можете преобразовать BigDecimal в двойное число просто с помощью (double value) - даже в длинное, если вы уверены, что вам не нужны дроби.

РЕДАКТИРОВАТЬ: фактическое решение:

(extend-protocol jdbc/ISQLValue

BigDecimal
(sql-value [value] (long value)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...