我需要一种方法来测试给定数组中是否存在值.到目前为止,我想出了类似的东西
select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int)
Run Code Online (Sandbox Code Playgroud)
但我一直认为应该有一个更简单的方法,我只是看不到它.
编辑:刚认识到我能做到这一点
select '{1,2,3}'::int[] @> ARRAY[value_variable::int]
Run Code Online (Sandbox Code Playgroud)
这要好得多,我相信这已经足够了,但如果你有其他方法可以做,请分享.
在Postgres sql语句中检查value是null还是空字符串的最佳方法是什么?
值可以是长表达式,因此最好只检查一次.
目前我正在使用:
coalesce( trim(stringexpression),'')=''
Run Code Online (Sandbox Code Playgroud)
但它看起来有点难看.
stringexpression可以是char(n)包含char(n)具有尾随空格的列的列或表达式.
最好的方法是什么?
我在文档中找不到这个问题的明确答案.如果列是数组类型,是否会对所有输入的值进行单独索引?
我创建了一个包含一int[]列的简单表,并在其上放置了一个唯一索引.我注意到我无法添加相同的整数数组,这使我相信索引是数组项的组合,而不是每个项的索引.
INSERT INTO "Test"."Test" VALUES ('{10, 15, 20}');
INSERT INTO "Test"."Test" VALUES ('{10, 20, 30}');
SELECT * FROM "Test"."Test" WHERE 20 = ANY ("Column1");
Run Code Online (Sandbox Code Playgroud)
索引是否有助于此查询?
我正在尝试执行这样的查询:
SELECT * FROM table WHERE id IN (1,2,3,4)
Run Code Online (Sandbox Code Playgroud)
问题是我要过滤的ID列表不是常量,每次执行时都需要不同.我还需要逃避id,因为它们可能来自不受信任的来源,尽管我实际上会逃避查询中的任何内容,无论源的可信度如何.
节点的Postgres似乎与绑定参数专门工作:client.query('SELECT * FROM table WHERE id = $1', [ id ]); 如果我有一个已知数量的值(client.query('SELECT * FROM table WHERE id IN ($1, $2, $3)', [ id1, id2, id3 ])),但是不能直接使用数组,这将有效:client.query('SELECT * FROM table WHERE id IN ($1)', [ arrayOfIds ])因为似乎没有任何特殊的数组参数处理.
根据数组中项目的数量动态构建查询模板,并将ids数组扩展到查询参数数组(在我的实际情况下,除了id列表之外还包含其他参数)似乎是不合理的负担.在查询模板中对id列表进行硬编码似乎也不可行,因为node-postgres不提供任何值转义方法.
这似乎是一个非常常见的用例,所以我的猜测是我实际上忽略了某些东西,而不是不可能将常见的IN (values)SQL运算符与node-postgres一起使用.
如果有人以比我上面列出的方式更优雅的方式解决了这个问题,或者如果我真的错过了关于node-postgres的内容,请帮忙.
我试过了两个
1)smthng = any(从exmplTable中选择id)
2)smthng in(从exmplTable中选择id)
我的数据得到了相同的结果.
这两个表达有什么不同吗?
有没有其他方法可以integer[]在Postgres 的列中搜索某个值?
我目前安装的Postgres版本并没有让下面的语句:
SELECT * FROM table WHERE values *= 10;
Run Code Online (Sandbox Code Playgroud)
数组示例:
'{11043,10859,10860,10710,10860,10877,10895,11251}'
'{11311,10698,10697,10710,10712,10711,10708}'
Run Code Online (Sandbox Code Playgroud)
该语句应返回数组包含的每一行'10710'.
我曾经有过如下查询:
MyModel.where(id: ids)
Run Code Online (Sandbox Code Playgroud)
哪个生成sql查询如:
SELECT "my_models".* FROM "my_models"
WHERE "my_models"."id" IN (1, 28, 7, 8, 12)
Run Code Online (Sandbox Code Playgroud)
现在我想改为使用ANY而不是IN.我创造了这个:
MyModel.where("id = ANY(VALUES(#{ids.join '),('}))"
Run Code Online (Sandbox Code Playgroud)
现在,当我使用空数组时,ids = []我得到以下错误:
MyModel Load (53.0ms) SELECT "my_models".* FROM "my_models" WHERE (id = ANY(VALUES()))
ActiveRecord::JDBCError: org.postgresql.util.PSQLException: ERROR: syntax error at or near ")"
ActiveRecord::StatementInvalid: ActiveRecord::JDBCError: org.postgresql.util.PSQLException: ERROR: syntax error at or near ")"
Position: 75: SELECT "social_messages".* FROM "social_messages" WHERE (id = ANY(VALUES()))
from arjdbc/jdbc/RubyJdbcConnection.java:838:in `execute_query'
Run Code Online (Sandbox Code Playgroud) 我有两个查询执行相同的操作。1
SELECT *
FROM "Products_product"
WHERE ("Products_product"."id" IN
(SELECT U0."product_id"
FROM "Products_purchase" U0
WHERE (U0."state" = 1
AND U0."user_id" = 5))
AND "Products_product"."state" IN (1,
6,
3)
AND UPPER("Products_product"."title" :: TEXT) LIKE UPPER('%toronto%'))
ORDER BY "Products_product"."title_index" ASC
LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
2
SELECT *
FROM "Products_product"
WHERE ("Products_product"."id" = ANY (ARRAY(
(SELECT U0."product_id"
FROM "Products_purchase" U0
WHERE (U0."state" = 1
AND U0."user_id" = 5))))
AND "Products_product"."state" IN (1,
6,
3)
AND UPPER("Products_product"."title" :: TEXT) LIKE UPPER('%toronto%'))
ORDER BY "Products_product"."title_index" ASC
LIMIT 10; …Run Code Online (Sandbox Code Playgroud) 拥有这个:
somevars := []int{1, 2, 3, 4}
rows, err = db.Query("SELECT c1,c2 FROM table"+tid+" WHERE c1 IN($1,$2,$3,$4);", somevars)
Run Code Online (Sandbox Code Playgroud)
收到:
sql:转换参数$ 1类型:不支持的类型[] int,一个int切片
有什么办法可以使一部分参数与lib / pq一起使用?
我很好奇为什么以下两个表达式有不同的结果——一个NULL和另一个TRUE:
postgres=# select array[1,null]=array[1,null];
?column?
----------
t
(1 row)
postgres=# select (1,null)=(1,null);
?column?
----------
(1 row)
Run Code Online (Sandbox Code Playgroud)
这是什么原因呢?在你的回答中,你能否链接到 Postgres 中的文档或一些 SQL 参考,其中说明了与NULL内部值进行比较时行和列表类型的行为?
假设我们有两个表:
CREATE TABLE element (
pk1 BIGINT NOT NULL,
pk2 BIGINT NOT NULL,
pk3 BIGINT NOT NULL,
-- other columns ...
PRIMARY KEY (pk1, pk2, pk3)
);
CREATE TYPE element_pk_t AS (
pk1 BIGINT,
pk2 BIGINT,
pk3 BIGINT
);
CREATE TABLE collection (
id BIGINT,
elements element_pk_t[] NOT NULL,
);
Run Code Online (Sandbox Code Playgroud)
具有element复合PK。自定义类型element_pk_t注册匹配的复合类型。该collection表包含数组element_pk_t。
我想在单个查询中查询表中elementPK 与 selected 中的元素匹配的所有行。collection.elements
我尝试过的:
SELECT *
FROM element
WHERE (pk1, pk2, pk3) IN (SELECT unnest(elements)
FROM collection …Run Code Online (Sandbox Code Playgroud)