我目前的代码如下:
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
的条目?
答案 0 :(得分:4)
您可以转发text
并转换为integer
数组:
AND string_to_array(idx.indkey::text, ' ')::int2[] = ARRAY[col.attnum]
实际上,由于pg_attribute.attnum
是smallint
(int2
),因此请使用int2[]
。
由于您只对 单 列感兴趣,因此您可以简化:
AND idx.indkey::text = col.attnum::text
在索引中处理多列时要小心。考虑这个相关的答案: