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")
我需要像这样执行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")