node.js - 使用 Node 和 pg-promise 加入 postgres 中的值列表

标签 node.js postgresql pg-promise

我正在尝试创建一个查询,例如

SELECT e.col1, e.col2 
FROM entity e
INNER JOIN (
    VALUES
    (1377776),(1377792),(1377793),(1377794),(1377795),(1377796)
) ex(ex_entityid) ON (entityid = ex_entityid)

假设我有一个包含数组中的数字 13777xx 的数组,我将如何生成此查询?

我从这个问题中得到了这个语法:https://stackoverflow.com/a/17824797/425544 .我的输入列表足够大,使用 IN 太慢了。

到目前为止,使用 $0:csv,我可以让我的值成为一个逗号分隔的列表。我不知道如何格式化这些值,以便它有括号。如果我在没有 :csv 标签的情况下提供数组,它会在值之前添加“array”,然后出现语法错误。

最佳答案

Given I have an array containing the numbers 13777xx in an array, how would I generate this query?

任意数

如果你有一个实际的数组,只需传递数组字面量,形式如下:

'{1377776,1377792,1377793}'

对于只有一手值的小数组,您可以在连接中使用 ANY 结构:

SELECT col1, col2 
FROM   entity
WHERE  entityid = ANY ($my_array::int[]);

对于字符串文字,您将需要一个显式类型转换,如所演示的那样。

对于长数组,将数组unnest成一个集合(派生表)然后join like mu commented会更高效:

SELECT col1, col2
FROM   unnest(my_array::int[]) ex(entityid)
JOIN   entity USING (entityid);

通过为未嵌套的数字匹配列名,您可以方便地使用简短的 USING 子句作为连接条件。

请注意一个细微的区别:第一个查询隐式折叠输入中的重复项,而第二个查询为输入中的重复项生成重复项。您的选择。

或者,您也可以将单个值传递给 IN 表达式。但这通常较慢。 (再次:折叠重复项。)喜欢:

...
WHERE  entityid IN (1377776, 1377792, 1377793);

参见:

对于重复操作,您可以创建一个 VARIADIC 函数并将单个数字作为参数(或您选择的单个数组文字)传递。见:

不是那么随意的数字

如果您确实想根据“数字 13777xx” 进行查询,即 1377700 和 1377799 之间的所有数字,请使用 generate_series() 代替。喜欢:

SELECT col1, col2 
FROM   generate_series(1377700, 1377799) entityid
JOIN   entity USING (entityid);

或者,最简单和最快的方法是,使用单个范围谓词调整 WHERE 子句:

SELECT col1, col2 
FROM   entity
WHERE  entityid BETWEEN 1377700 AND 1377799;

关于node.js - 使用 Node 和 pg-promise 加入 postgres 中的值列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55524574/

相关文章:

javascript - 对特定索引范围内的数组元素求和

java - 使用 PostgreSQL 时 isReadOnly JDBC 参数的行为是什么?

javascript - DOTENV 未正确读取变量

node.js - NodeJS、promise、streams - 处理大型 CSV 文件

node.js - 如何使 pg-promise 返回行作为数组?

node.js - 无法在 Windows 上使用 nvm 安装 Node

node.js - JupyterLab plotly 扩展错误 : Cannot find module jupyter\lab\staging\node_modules\ejs\postinstall. js

javascript - NodeJS 服务器更改 JSON 对象的键名

sql - 从 Postgresql 中的 View 中选择随机样本

mysql - PostgreSQL 中的 sec_to_time() 函数?