Ruby Sequel select 来自值

Ruby Sequel select from values

我需要像这样执行sql:

SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (3, 'three')) AS t (num,letter) ...;

使用 sequel 语法。

我需要这样的东西:

two_dimesional_array = [[1, "one"], [2, 'two'], [3, 'three']]
DB["SELECT * FROM (VALUES ?)", two_dimesional_array ]

原因 - 我有一个数据列表,我需要 select 数据库中不存在的记录 table。

这个例子有效:

DB["SELECT * FROM unnest(?) EXCEPT ALL SELECT out_id FROM my_table", Sequel.pg_array(ids)]

它运行良好,但我需要使用我的数据中的 2 列创建 table。函数 unnest 创建单列 table.

更新:

我目前找到的最佳解决方案是使用 sequel sql_value_list

values = DB.literal(
        records.map{|e| [e['one'], e['two']]}.sql_value_list
).sub(/^\(/, '(VALUES ')
sql = "SELECT * FROM #{values} ..."

这不是一个很好的决定,因为 sql_value_list 在没有单词 VALUES 的情况下在外括号中生成列表,我需要打开文字并替换这个单词。

也许有更优雅的方式?

我有一种丑陋的方法可以将二维数组转换为行:

t=# with c(a) as (values('[[1, "one"], [2, "two"], [3, "three"]]'::jsonb))
, u as (select translate(jsonb_array_elements_text(a)::text,'[]','{}')::text[]::text::text[] ugly from c)
select ugly[1] u1,ugly[2] u2 from u;
 u1 |  u2
----+-------
 1  | one
 2  | two
 3  | three
(3 rows)

请注意,我将单引号更改为双引号以使其有效 json。 我确定有更优雅的解决方案,但今晚没有

Sequel 原生支持 VALUES:

DB[DB.values([[1, 'one'], [2, 'two'], [3, 'three']]).as(:t, [:num, :letter])]
# SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (3, 'three')) AS "t"("num", "letter")