我的数据库有很多表(比如 400+),我只记得我要找的表的部分名称。
我知道\d
会显示所有表格,但这太多了。是否有一些命令可以列出名称与给定正则表达式匹配的所有表?
谢谢
它内置于 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_class
join 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)
除非你把它变成一个过程,否则不是很方便,但是;
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.*`
有一个名为的表pg_tables
,其中包含所有表名。