Сопоставить все пары ключ / вал

Исходный запрос:

-- :name select*-list
-- :command :query
-- :result :raw
-- :doc Select all lists.
-- parameters()
SELECT * FROM list;

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

(select*-list db-spec {:name "Fruit" :type "Foo"})

должно привести к:

SELECT * FROM list 
WHERE name = 'Fruit'
AND type = 'Foo';

Я могу придумать несколько уродливых способов сделать это, но, скорее всего, я упускаю из виду хороший способ сделать это.

2 ответа

У JDBC есть несколько отличных ярлыков из коробки. Одним из них является поиск по ключам. Он делает именно то, что вы хотите: берет карту пар ключ / значение и составляет набор WHERE пункты, связанные с AND:

(jdbc/find-by-keys db-spec :users {:name "John" :age 42 :city "Chita"})

окажется

select from users
where
  name = 'John'
  and age = 42
  and city = 'Chita';

Вот пример java-jdbc.sql

(require '[java-jdbc.sql :as sql])

(jdbc/query db-spec
  (sql/select * :fruit (sql/where {:appearance "ripe"})))
;; -> ({:grade 8.4, :unit "carton", :cost 12, :appearance "ripe", :name "Plum"})

Посмотри пожалуйста:

Другие вопросы по тегам