相关疑难解决方法(0)

PostgreSQL可以索引数组列吗?

我在文档中找不到这个问题的明确答案.如果列是数组类型,是否会对所有输入的值进行单独索引?

我创建了一个包含一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)

索引是否有助于此查询?

arrays postgresql indexing

132
推荐指数
3
解决办法
7万
查看次数

Postgres:检查数组字段是否包含值?

我确定这是一个重复的问题,因为某个地方有答案,但是谷歌搜索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问题似乎都是基于更复杂的示例.

postgresql

34
推荐指数
4
解决办法
4万
查看次数

如何在带有Rails的WHERE子句中使用ANY而不是IN?

我曾经有过如下查询:

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)

sql postgresql activerecord ruby-on-rails-3 ruby-on-rails-4

11
推荐指数
1
解决办法
1万
查看次数

检查Postgres数组中是否存在NULL

此问题类似,如何查找数组中是否存在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)

sql arrays postgresql null postgresql-9.1

11
推荐指数
1
解决办法
4945
查看次数

PostgreSQL:正则表达式转义函数

为了放弃阅读整个问题,我的基本问题是:
PostgreSQL中是否有一个函数来转义字符串中的正则表达式字符?

我已经探测过文档,但无法找到这样的功能.

这是完整的问题:

在PostgreSQL数据库中,我有一个包含唯一名称的列.我还有一个定期在此字段中插入名称的进程,并且为了防止重复,如果需要输入已存在的名称,它会在末尾附加一个空格和括号.

即姓名,姓名(1),姓名(2),姓名(3)等

就目前而言,我使用以下代码来查找要在系列中添加的下一个数字(用plpgsql编写):

var_name_id := 1;

SELECT CAST(substring(a.name from E'\\((\\d+)\\)$') AS int)
INTO var_last_name_id
FROM my_table.names a
WHERE a.name LIKE var_name || ' (%)'
ORDER BY CAST(substring(a.name from E'\\((\\d+)\\)$') AS int) DESC
LIMIT 1;

IF var_last_name_id IS NOT NULL THEN
    var_name_id = var_last_name_id + 1;
END IF;

var_new_name := var_name || ' (' || var_name_id || ')';
Run Code Online (Sandbox Code Playgroud)

(var_name包含我试图插入的名称.)

这暂时有效,但问题出在WHERE声明中:

WHERE a.name LIKE var_name || ' (%)'
Run Code Online (Sandbox Code Playgroud)

此检查不会验证有%问题的数字,并且它不会考虑多个括号,如"Name((1))",如果存在任何一种情况,则会抛出强制转换异常.

WHERE声明确实需要像更多的东西: …

regex postgresql escaping plpgsql pattern-matching

9
推荐指数
2
解决办法
4853
查看次数

LATERAL JOIN不使用trigram索引

我想使用Postgres对地址进行一些基本的地理编码.我有一个地址表,有大约100万个原始地址字符串:

=> \d addresses
  Table "public.addresses"
 Column  | Type | Modifiers
---------+------+-----------
 address | text |
Run Code Online (Sandbox Code Playgroud)

我还有一张位置数据表:

=> \d locations
   Table "public.locations"
   Column   | Type | Modifiers
------------+------+-----------
 id         | text |
 country    | text |
 postalcode | text |
 latitude   | text |
 longitude  | text |
Run Code Online (Sandbox Code Playgroud)

大多数地址字符串包含邮政编码,所以我的第一次尝试是做类似和横向连接:

EXPLAIN SELECT * FROM addresses a
JOIN LATERAL (
    SELECT * FROM locations
    WHERE address ilike '%' || postalcode || '%'
    ORDER BY LENGTH(postalcode) DESC
    LIMIT 1
) AS l ON …
Run Code Online (Sandbox Code Playgroud)

postgresql indexing query-optimization nearest-neighbor postgresql-9.4

8
推荐指数
1
解决办法
476
查看次数

操作员〜<〜在Postgres中

(最初是这个问题的一部分,但它有点无关紧要,所以我决定把它作为自己的问题.)

我找不到运营商~<~是什么.Postgres的手册只提到 ~和类似的运营商在这里,但没有迹象~<~.

在psql控制台中摆弄时,我发现这些命令会产生相同的结果:

SELECT * FROM test ORDER BY name USING ~<~;
SELECT * FROM test ORDER BY name COLLATE "C";
Run Code Online (Sandbox Code Playgroud)

这些给出了相反的顺序:

SELECT * FROM test ORDER BY name USING ~>~;
SELECT * FROM test ORDER BY name COLLATE "C" DESC;
Run Code Online (Sandbox Code Playgroud)

还有关于代字号运算符的一些信息:

\do ~*~
                                    List of operators
  Schema   | Name | Left arg type | Right arg type | Result type |       Description       
------------+------+---------------+----------------+-------------+-------------------------
pg_catalog | ~<=~ | character     | …
Run Code Online (Sandbox Code Playgroud)

sorting postgresql operators pattern-matching

6
推荐指数
1
解决办法
693
查看次数