当使用 LIKE ANY(数组 ['%term1%'、'%term2%' 等])时,是否有函数 return 数组中的哪个短语与行匹配?

Is there a function to return which phrase in array the row matched when using LIKE ANY (array['%term1%', '%term2%', etc.])?

我希望我的架构中的所有 table 与来自不同架构的具有相似名称的其他 table 的列表相匹配。我正在使用以下查询:

SELECT TABLE_NAME, COUNT(COLUMN_NAME) ColCount
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'schema_2' and TABLE_NAME LIKE ANY (array[
'%table1%', 
'%table2%',
'%table3%',
'%table4%',
'%table5%'])

我想在输出中添加另一列,它指定 schema_2 中的 table 匹配数组中的哪个名称,即

TABLE_NAME COL_COUNT  SCHEMA_1_TABLE
table1a    15         table1

有办法吗?

您可以尝试使用联接。有点像:

WITH a AS (SELECT unnest(array['%table1%','%table2%','%table3%','%table4%','%table5%']) 
    AS table)
SELECT
    isc.TABLE_NAME,
    COUNT(isc.COLUMN_NAME),
    REPLACE(a.table,'%','')
FROM
    INFORMATION_SCHEMA.COLUMNS isc
    LEFT JOIN a ON (isc.TABLE_NAME LIKE a.table)
WHERE
    isc.TABLE_SCHEMA = 'schema_2'
    AND a.table IS NOT NULL
GROUP BY
    isc.TABLE_NAME,
    a.table

您还可以将 INFORMATION_SCHEMA.COLUMNS 与 INFORMATION_SCHEMA.TABLES 结合起来,以便仅检测任何重复项,而不仅仅是指定的重复项。