如何测试int2vector是否只包含一个特定值?

时间:2015-01-21 16:51:16

标签: sql arrays postgresql types comparison

我目前的代码如下:

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运算符
  • 使用@>运算符

如何检查indkey是否只包含一个完全col.attnum的条目?

1 个答案:

答案 0 :(得分:4)

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

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

实际上,由于pg_attribute.attnumsmallintint2),因此请使用int2[]

由于您只对 列感兴趣,因此您可以简化:

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

SQL Fiddle.

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