Postgresql 中查询表格列名和类型的sql语句

本文介绍了一段SQL查询语句,该语句能够获取指定表的所有列名及其对应的列类型。列类型包括bigint、smallint、integer等,并提供了这些类型的数值表示。

SELECT a.attname as col_name,a.atttypid as col_type FROM  pg_catalog.pg_attribute a WHERE a.attnum > 0 AND NOT a.attisdropped AND a.attrelid = ( SELECT c.oid FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname ~ '^(tableName )$' AND pg_catalog.pg_table_is_visible(c.oid))

 

可以得到所有列的列名以及列类型,列类型对应的值如下:

 

bigint            = 20;
smallint            = 21;
integer            = 23;
character        = 1042;
character_var    = 1043;
timestamp        = 1114;
double            = 701;

<think>我们正在讨论的是如何确认数据库中表格或视图的类型。用户希望使用SQL语句来区分数据库中的对象是表还是视图。 根据引用[1]中的信息,我们可以查询系统表(在SQL Server中是sysobjectssyscomments)来获取对象信息。但是,不同的数据库管理系统(DBMS)有不同的系统表或视图来存储元数据。 在SQL Server中,我们可以使用以下查询: ```sql SELECT name AS ObjectName, type_desc AS ObjectType FROM sys.objects WHERE type IN ('U', 'V') -- 'U'表示用户表,'V'表示视图 AND name = 'YourObjectName'; -- 替换为具体的对象名 ``` 或者,如果我们想列出所有表视图: ```sql SELECT name AS ObjectName, CASE type WHEN 'U' THEN 'User Table' WHEN 'V' THEN 'View' ELSE type_desc END AS ObjectType FROM sys.objects WHERE type IN ('U', 'V'); ``` 在MySQL中,我们可以通过查询`information_schema`数据库中的`TABLES`视图来获取: ```sql SELECT TABLE_NAME AS ObjectName, TABLE_TYPE AS ObjectType FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'YourDatabaseName'; -- 指定数据库名 ``` 这将返回指定数据库中所有表视图的信息,其中`TABLE_TYPE`列的值会是'BASE TABLE'(表示表)或'VIEW'(表示视图)。 在Oracle数据库中,我们可以查询`USER_OBJECTS`视图: ```sql SELECT object_name AS ObjectName, object_type AS ObjectType FROM user_objects WHERE object_type IN ('TABLE','VIEW'); ``` 或者,如果我们想查看当前用户下的所有表视图。 注意:用户的需求是确认一个特定的对象是表还是视图,因此我们需要根据具体的DBMS编写相应的查询。 由于用户没有指定使用的数据库类型,我们可以提供几种常见数据库系统的查询方法。 另外,引用[1]中提到了使用`sysobjects``syscomments`来查找与某个表相关的视图、存储过程等,但我们这里只需要区分表与视图,所以更直接的方法是查询系统元数据表(或视图)中的类型字段。 总结: - SQL Server: 使用`sys.objects`系统视图,通过`type`字段('U'表示表,'V'表示视图)。 - MySQL: 使用`information_schema.TABLES`,通过`TABLE_TYPE`字段('BASE TABLE'表示表,'VIEW'表示视图)。 - Oracle: 使用`user_objects`(或其他`*_OBJECTS`视图),通过`object_type`字段('TABLE'表示表,'VIEW'表示视图)。 如果用户需要更通用的方法,可能需要根据数据库类型调整。 现在,我们提供针对SQL ServerMySQL的示例: **SQL Server:** ```sql -- 查询特定对象(例如:'YourTableOrViewName')是表还是视图 SELECT name AS ObjectName, CASE WHEN type = 'U' THEN 'User Table' WHEN type = 'V' THEN 'View' ELSE 'Other' END AS ObjectType FROM sys.objects WHERE name = 'YourTableOrViewName'; ``` **MySQL:** ```sql -- 查询特定对象(例如:'YourTableOrViewName')是表还是视图 SELECT TABLE_NAME AS ObjectName, TABLE_TYPE AS ObjectType FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'YourDatabaseName' AND TABLE_NAME = 'YourTableOrViewName'; ``` **Oracle:** ```sql -- 查询特定对象(例如:'YOUR_TABLE_OR_VIEW_NAME')是表还是视图 SELECT object_name AS ObjectName, object_type AS ObjectType FROM user_objects WHERE object_name = 'YOUR_TABLE_OR_VIEW_NAME' AND object_type IN ('TABLE', 'VIEW'); ``` 注意:在Oracle中,对象名称默认是大写的,除非创建时使用了双引号指定了大小写。如果创建时使用了小写,那么查询时也需要使用双引号包裹小写的对象名。 最后,我们生成相关问题: §§相关问题§§ 1. 如何查询数据库中所有存储过程的定义? 2. 如何获取数据库表的结构(列名、数据类型等)? 3. 如何查看视图的定义SQL? 4. 如何判断一个数据库对象是否存在? 5. 不同数据库管理系统(如SQL Server, MySQL, Oracle)中元数据查询的差异有哪些?</think>### 确认数据库表格/视图类型SQL 语句 #### 🔍 核心方法 在主流数据库系统中,可通过查询系统表/视图来确认对象类型: **1. SQL Server 系统表查询** ```sql SELECT name AS 对象名称, type_desc AS 对象类型, create_date AS 创建时间 FROM sys.objects WHERE name IN ('表名', '视图名') -- 替换为实际名称 AND type IN ('U', 'V') -- U=用户表, V=视图 ``` [^1] [^3] **2. MySQL 元数据查询** ```sql SELECT TABLE_NAME AS 对象名称, TABLE_TYPE AS 对象类型 FROM information_schema.TABLES WHERE TABLE_SCHEMA = '数据库名' AND TABLE_NAME IN ('表名', '视图名'); -- 替换为实际名称 ``` *结果说明:* - `BASE TABLE` = 数据表 - `VIEW` = 视图 **3. Oracle 数据字典查询** ```sql SELECT object_name AS 对象名称, object_type AS 对象类型 FROM user_objects WHERE object_name IN ('表名', '视图名') -- 替换为实际名称 AND object_type IN ('TABLE', 'VIEW'); ``` #### 📊 通用跨平台方法 ```sql -- 同时获取表/视图及其字段信息 SELECT t.TABLE_NAME AS 对象名称, t.TABLE_TYPE AS 对象类型, c.COLUMN_NAME AS 字段名, c.DATA_TYPE AS 字段类型 FROM information_schema.TABLES t JOIN information_schema.COLUMNS c ON t.TABLE_NAME = c.TABLE_NAME WHERE t.TABLE_SCHEMA = '数据库名' AND t.TABLE_NAME IN ('表名', '视图名'); -- 替换为实际名称 ``` *此方法适用于 MySQLPostgreSQLSQL Server 等主流数据库*[^2] #### ⚠️ 注意事项 1. **权限要求**:执行查询需要 `SELECT` 权限 2. **大小写敏感**:某些数据库(如 Oracle)对象名区分大小写 3. **系统表差异**: - SQL Server:`sys.objects` - MySQL:`information_schema` - Oracle:`user_objects`/`all_objects` 4. **结果解读**: - 表类型标识:TABLE/BASE TABLE/U - 视图类型标识:VIEW/V #### 💡 实用技巧 ```sql -- 快速检查对象是否存在及类型 IF EXISTS ( SELECT 1 FROM sys.objects WHERE name = '对象名' AND type IN ('U','V') ) SELECT '对象存在' AS 状态; ELSE SELECT '对象不存在' AS 状态; ``` [^1] [^4] --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值