【问题标题】:postgres comparing varying character with array from string_to_arraypostgres 将不同的字符与 string_to_array 中的数组进行比较
【发布时间】:2016-01-28 04:17:48
【问题描述】:

我在比较 Postgres 类型时遇到问题,希望能得到一些帮助。我正在从包含 tilda 分隔字符串的配置表中提取有效文档类型,如下所示:

SELECT string_to_array(value,'|') as document_kinds
  FROM company_configs
  WHERE option = 'document_kinds'

这给了我一个值数组,所以

'doc1|doc2|doc3' 变成 {doc1,doc2,doc3}

接下来我需要为给定人员选择与我的文档类型匹配的文档:

SELECT * FROM people
  JOIN documents ON ...
  WHERE kind IN
   (SELECT string_to_array(value,'|') as document_kinds
    FROM company_configs
    WHERE option = 'document_kinds')

documents.kind 列是“字符变化” 我的理解是 string_to_array 正在生成一个文本值数组 'text[]'

此查询产生错误“错误:运算符不存在:字符变化=文本[]”

如果我将 'kind' 转换为文本,使用

SELECT * FROM people
 JOIN documents ON ...
 WHERE kind::text IN
  (SELECT string_to_array(value,'|') as visa_document_kinds FROM languages_united.company_configs WHERE option = 'visa_document_kinds')

我收到错误“错误:运算符不存在:text = text[]”

我不知道如何比较两者,如果有任何建议,我将不胜感激。

提前致谢 丹

Postgres 9.4.1

【问题讨论】:

    标签: arrays postgresql comparison


    【解决方案1】:

    如果您的子查询正好返回一行,您可以使用 ANY operator 对任何数组元素进行选择:

    SELECT *
    FROM people
    JOIN documents ON ...
    WHERE kind = ANY (
      SELECT string_to_array(value,'|') as document_kinds
      FROM company_configs
      WHERE option = 'document_kinds');
    

    如果子查询可能返回多行,可以使用regexp_split_to_table() function:

    SELECT *
    FROM people
    JOIN documents ON ...
    JOIN (
      SELECT document_kinds
      FROM company_configs,
           regexp_split_to_table(value, '\|') as document_kinds
      WHERE option = 'document_kinds') sub ON sub.document_kinds = kind;
    

    (您必须对其进行调整以匹配查询的其余部分。)

    【讨论】:

    • 非常感谢您的回复,一些调整已经奏效 - regex_split_to_table 不接受/需要“g”选项,分隔符需要转义为“\|”。再次感谢。丹
    • 啊,好的。正则表达式中的'g' 标志表示所有匹配项都必须匹配,但我认为这对于这个函数是显而易见的。答案已更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    相关资源
    最近更新 更多