【问题标题】:How can I test if int2vector contains exactly one specific value?如何测试 int2vector 是否恰好包含一个特定值?
【发布时间】:2015-03-20 06:56:21
【问题描述】:

我当前的代码如下所示:

SELECT
  1
FROM pg_namespace   sch
JOIN pg_class       tab ON tab.relnamespace = sch.oid
JOIN pg_index       idx ON idx.indrelid     = tab.oid
JOIN pg_class       icl ON icl.oid          = idx.indexrelid
JOIN pg_attribute   col ON col.attrelid     = tab.oid
WHERE
      sch.nspname      = 'my_schema'
  AND tab.relkind      = 'r'
  AND idx.indisprimary
  AND icl.relname      = 'pk_my_table'
  AND col.attname      = 'my_table_id'
  AND idx.indkey       = ARRAY[col.attnum] -- <-- The problematic comparison
;

这不起作用,因为:ERROR: operator does not exist: int2vector = smallint[]

我尝试了以下各种组合:

  • indkey 转换为idx.indkey::smallint[] 之类的数组
  • ARRAY[col.attnum] 转换为int2vector
  • 使用ALL 运算符
  • 使用@&gt; 运算符

如何检查indkey是否恰好包含一个恰好是col.attnum的条目?

【问题讨论】:

    标签: sql arrays postgresql types comparison


    【解决方案1】:

    您可以转换为 text 并转换为 integer 数组:

    AND string_to_array(idx.indkey::text, ' ')::int2[] = ARRAY[col.attnum]
    

    实际上,由于pg_attribute.attnumsmallint (int2),所以使用int2[]

    由于您只对单个列感兴趣,您可以简化:

    AND idx.indkey::text = col.attnum::text
    

    SQL Fiddle.

    处理索引中的多列时要小心。考虑这个相关的答案:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 2018-12-20
      • 2011-07-15
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多