12

我的数据库有很多表(比如 400+),我只记得我要找的表的部分名称。

我知道\d会显示所有表格,但这太多了。是否有一些命令可以列出名称与给定正则表达式匹配的所有表?

谢谢

4

3 回答 3

23

它内置于 psql 中,您可以在 , 等中使用通配符\d\dt例如:

craig=> \dt test*
         List of relations
 Schema |   Name    | Type  | Owner 
--------+-----------+-------+-------
 public | test      | table | craig
 public | testtable | table | craig
 public | testu     | table | craig
 public | testx     | table | craig
(4 rows)

您将要使用\dt,因为\d将显示每个表的详细信息,而不仅仅是列出表。

您也可以使用模式来执行此操作,例如:

\dt *.sometable

将列出以sometable任何模式命名的所有表。

比针对pg_classjoin topg_namespace或 querying编写查询要方便得多information_schema

接受通常的通配符语法,其中?是任何单个字符,并且*是零个或多个字符。因此\dt ????将列出所有具有四个字符名称的表。

允许使用多个通配符,例如:

craig=> \dt public.*e?t*
           List of relations
 Schema |     Name     | Type  | Owner 
--------+--------------+-------+-------
 public | exclude_test | table | craig
 public | prep_test    | table | craig
 public | test         | table | craig
 public | testtable    | table | craig
 public | testu        | table | craig
 public | testx        | table | craig
(6 rows)
于 2013-06-29T09:27:36.660 回答
4

除非你把它变成一个过程,否则不是很方便,但是;

SELECT * FROM pg_tables WHERE SUBSTRING(tablename FROM '<regex>') <> '';

为了更方便,您可以创建并调用 proc;

CREATE FUNCTION ft(TEXT) RETURNS SETOF pg_tables AS 
  'SELECT * FROM pg_tables WHERE SUBSTRING(tablename from $1) <> '''';'
LANGUAGE SQL;

SELECT * FROM ft('.*oc.*')      -- Gets all tables matching `.*oc.*`

一个用于测试两者的 SQLfiddle

于 2013-06-28T21:16:32.800 回答
0

有一个名为的表pg_tables,其中包含所有表名。

于 2013-06-28T21:10:11.953 回答