sql—如何在单个查询中将同一表中的不同行作为列表返回

des4xlb0  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(324)

我有一个表,它有一个布尔列,这个列用于过滤一些响应。我需要以元组的形式返回一个响应 {claimed, unclaimed} (想象一下这张table叫 winnings )
在处理它时,我做了两个单独的查询返回 claimed 那么 unclaimed 行并手动构造响应,然后返回所有行,而不检查布尔列并在查询外部拆分它。现在我想知道是否有一种方法可以在同一个表上运行一个查询并同时返回这两个查询 claimed 以及 unclaimed 作为单独的结果,主要是为了性能,希望它运行得更好。我尝试过使用联接,但它返回一个包含两个项目的列表,如:

[{claimed, unclaimed}, {claimed, unclaimed}]...

当我想要的时候:

{claimed, unclaimed}

# OR

[{claimed, unclaimed}]

最多,没有更多的元组。请注意,我不是运行原始查询,而是使用库,因此如果术语不正确,请原谅。
这是我运行的最后一个查询:

SELECT w0."claimed", w1."claimed"
FROM "winnings" AS w0
INNER JOIN "winnings" AS w1 ON TRUE
WHERE (w0."claimed" AND NOT (w1."claimed"))
LIMIT 10;

编辑:更多细节。
当我从上面运行查询时,得到的结果是:

=> SELECT w0."claimed", w1."claimed" FROM "winnings" AS w0 INNER JOIN "winnings" AS w1 ON TRUE WHERE (w0."claimed" AND NOT (w1."claimed")) LIMIT 10;

 claimed | claimed 
---------+---------
 t       | f
 t       | f
 t       | f
 t       | f
 t       | f
 t       | f
 t       | f
 t       | f
 t       | f
 t       | f
(10 rows)

这是转换成以下关于长生不老药,这是我正在使用的语言:

[
  true: false,
  true: false,
  true: false,
  true: false,
  true: false,
  true: false,
  true: false,
  true: false,
  true: false,
  true: false
]

这是一个关键字列表,内部是一个元组列表 [{true, false}, {true, false}] -我想要: [{[true, true], [false, false]}] 意思是我想要两个列表,每个列表都有各自的行,只在一个列表中声明,在另一个列表中只声明无人声明。
我真的不介意它输出的类型,只要它包括两个列表和它们的行我是怎么说的。

vbopmzt1

vbopmzt11#

要从行列表中获取第一列,可以使用 Enum.map/2 要获取每个元组的第一个元素:

Enum.map(rows, &elem(&1, 0))

如果您是elixir的新手,&语法可能有点混乱。那个代码是

Enum.map(rows, fn field -> elem(field, 0) end)

您可以将其转换为一个函数,对所有列执行此操作,如下所示:

def columnize(rows = [first_row | _]) when is_tuple(first_row) do                 
  for column <- 1..tuple_size(first_row), do: Enum.map(rows, &elem(&1, column - 1))
end

def columnize([]) do
  []
end
``` `hd/1` 是用于获取列表中第一个元组的函数。这个 `= [first_row | _]` 部分保证参数是至少包含一个元素的列表;这个 `when is_tuple(first_row)` 确保至少第一行是元组。
如果你想知道更多关于 `for` ,这是一种理解。
注意,这个函数假设所有行都有相同的列数并且是元组(在查询结果中应该是真的;但在其他情况下可能不是),并将抛出 `ArgumentError` 如果第一行比其他行宽。如果列表中的其他元素不是元组,也会导致错误。
但这感觉很不自然。这可能是xy的问题吗?

相关问题