如何在Npgsql.NET与PostgreSQL中查询相似名称的表?
解决PostgreSQL中查询名称相似表的问题
- 你之前用的
\dt是PostgreSQL交互式客户端psql的专属元命令,不是标准SQL语句,直接通过Npgsql执行必然报语法错误,这是核心问题。 - 要在C#代码中实现类似MySQL
SHOW TABLES LIKE的功能,需要查询PostgreSQL的系统视图,推荐两种实用方式:
方法1:查询information_schema.tables(标准SQL兼容)
这是SQL标准定义的视图,跨数据库兼容性更好:
await connection.OpenAsync(); // ILIKE实现不区分大小写匹配,LIKE为区分大小写匹配 string searchPattern = $"%{tbSearch.Text}%"; string query = @" SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' -- 指定查询的模式,默认通常为public AND table_name ILIKE @pattern;"; NpgsqlCommand command = new NpgsqlCommand(query, connection); command.Parameters.AddWithValue("@pattern", searchPattern); // 读取查询结果 using (var reader = await command.ExecuteReaderAsync()) { while (await reader.ReadAsync()) { string tableName = reader.GetString(0); // 此处处理获取到的表名 } }
方法2:查询pg_catalog.pg_tables(PostgreSQL专属)
这是PostgreSQL自带的系统表,能获取更全面的表元数据:
await connection.OpenAsync(); string searchPattern = $"%{tbSearch.Text}%"; string query = @" SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = 'public' AND tablename ILIKE @pattern;"; NpgsqlCommand command = new NpgsqlCommand(query, connection); command.Parameters.AddWithValue("@pattern", searchPattern); // 读取结果逻辑同上
- 匹配规则调整:如果需要前缀匹配,把
%{tbSearch.Text}%改成{tbSearch.Text}%;后缀匹配则改成%{tbSearch.Text},和MySQL的LIKE语法逻辑一致。 - 关于使用体验:PostgreSQL和MySQL设计思路差异明显,刚切换确实会有适应期。MySQL的
SHOW系列是专属语法,而PostgreSQL更偏向用标准SQL查询系统视图获取元数据,习惯后会发现这种方式灵活性更强。
内容的提问来源于stack exchange,提问作者ZiAD
相关产品推荐
相关产品推荐

