我在文档中找不到这个问题的明确答案.如果列是数组类型,是否会对所有输入的值进行单独索引?
我创建了一个包含一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)
索引是否有助于此查询?
PostgreSQL中IN和ANY运算符有什么区别?
两者的工作机制似乎是一样的.任何人都能用一个例子来解释这个吗
我有一个看起来像这样的表:
CREATE TABLE tracks (id SERIAL, artists JSON);
INSERT INTO tracks (id, artists)
VALUES (1, '[{"name": "blink-182"}]');
INSERT INTO tracks (id, artists)
VALUES (2, '[{"name": "The Dirty Heads"}, {"name": "Louis Richards"}]');
Run Code Online (Sandbox Code Playgroud)
还有其他几个与此问题无关的列.将它们存储为JSON是有原因的.
我要做的是查找具有特定艺术家姓名(完全匹配)的曲目.
我正在使用此查询:
SELECT * FROM tracks
WHERE 'ARTIST NAME' IN
(SELECT value->>'name' FROM json_array_elements(artists))
Run Code Online (Sandbox Code Playgroud)
例如
SELECT * FROM tracks
WHERE 'The Dirty Heads' IN
(SELECT value->>'name' FROM json_array_elements(artists))
Run Code Online (Sandbox Code Playgroud)
但是,这会进行全表扫描,并且速度不是很快.我尝试使用函数创建GIN索引names_as_array(artists)并使用'ARTIST NAME' = ANY names_as_array(artists),但是不使用索引并且查询实际上明显更慢.
我正在PL/pgSQL中编写一个函数,我正在寻找检查行是否存在的最简单方法.
现在我正在选择一个integer进入a boolean,这不起作用.我对PL/pgSQL还没有足够的经验知道最好的方法.
这是我的功能的一部分:
DECLARE person_exists boolean;
BEGIN
person_exists := FALSE;
SELECT "person_id" INTO person_exists
FROM "people" p
WHERE p.person_id = my_person_id
LIMIT 1;
IF person_exists THEN
-- Do something
END IF;
END; $$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
更新 - 我现在正在做这样的事情:
DECLARE person_exists integer;
BEGIN
person_exists := 0;
SELECT count("person_id") INTO person_exists
FROM "people" p
WHERE p.person_id = my_person_id
LIMIT 1;
IF person_exists < 1 THEN
-- Do something
END IF;
Run Code Online (Sandbox Code Playgroud) 我确定这是一个重复的问题,因为某个地方有答案,但是谷歌搜索10分钟后我找不到答案,所以我要求编辑不要关闭它它可能对其他人有用的基础.
我正在使用Postgres 9.5.这是我的表:
Column ? Type ? Modifiers
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
id ? integer ? not null default nextval('mytable_id_seq'::regclass)
pmid ? character varying(200) ?
pub_types ? character varying(2000)[] ? not null
Run Code Online (Sandbox Code Playgroud)
我想在"Journal"中找到所有行pub_types.
我找到了文档和Google搜索,这就是我尝试过的:
select * from mytable where ("Journal") IN pub_types;
select * from mytable where "Journal" IN pub_types;
select * from mytable where pub_types=ANY("Journal");
select * from mytable where pub_types IN ("Journal");
select * from mytable where where pub_types contains "Journal";
Run Code Online (Sandbox Code Playgroud)
我已经扫描了postgres数组文档,但是看不到一个如何运行查询的简单示例,而StackOverflow问题似乎都是基于更复杂的示例.
我正在尝试为当前在LDAP存储中的主机数据提出PostgreSQL架构.部分数据是机器可以拥有的主机名列表,该属性通常是大多数人用来查找主机记录的关键.
我想将这些数据移动到RDBMS的一件事是能够在hostname列上设置唯一性约束,以便无法分配重复的主机名.如果主机只能有一个名称,这将很容易,但由于它们可以有多个名称,因此它更复杂.
我意识到这样做的完全规范化的方法是让一个主机名表的外键指向hosts表,但是我想避免让每个人都需要为最简单的查询做连接:
select hostnames.name,hosts.*
from hostnames,hosts
where hostnames.name = 'foobar'
and hostnames.host_id = hosts.id;
Run Code Online (Sandbox Code Playgroud)
我认为使用PostgreSQL数组可以为此工作,它们肯定使简单的查询变得简单:
select * from hosts where names @> '{foobar}';
Run Code Online (Sandbox Code Playgroud)
但是,当我在hostnames属性上设置唯一性约束时,它当然会将整个名称列表视为唯一值而不是每个名称.有没有办法让每个名称在每一行都是唯一的?
如果没有,有没有人知道另一种更有意义的数据建模方法?
有没有其他方法可以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) 与此问题类似,如何查找数组中是否存在NULL值?
这是一些尝试.
SELECT num, ar, expected,
ar @> ARRAY[NULL]::int[] AS test1,
NULL = ANY (ar) AS test2,
array_to_string(ar, ', ') <> array_to_string(ar, ', ', '(null)') AS test3
FROM (
SELECT 1 AS num, '{1,2,NULL}'::int[] AS ar, true AS expected
UNION SELECT 2, '{1,2,3}'::int[], false
) td ORDER BY num;
num | ar | expected | test1 | test2 | test3
-----+------------+----------+-------+-------+-------
1 | {1,2,NULL} | t | f | | t
2 | {1,2,3} | f | f …Run Code Online (Sandbox Code Playgroud) 在纯粹的postgres我们可以写:
SELECT * FROM my_table WHERE 10000 = ANY (array_field);
Run Code Online (Sandbox Code Playgroud)
要么
SELECT * FROM my_table WHERE 10000 = ALL (array_field);
Run Code Online (Sandbox Code Playgroud)
如何在没有原始sql的sqlalchemy的帮助下做同样的事情?