pgsql常用表方法和函数

文章详细介绍了PostgreSQL中pg_class表用于存储所有表的信息,包括如何查询表的继承关系、表的字段以及聚合函数。同时,文章还讨论了其他关键系统表如pg_namespace和pg_attribute,以及SQL字符串和日期时间的操作函数,如concat、to_char和date_part等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pg_class: 保存着所有表

select * from pg_class
字段:
  relnamespace :包含这个关系的名字空间(模式)的 OID。(引用 pg_namespace.oid)
  relname: 表、索引、视图等的名称。
select pg_class.relname	
from pg_class, pg_namespace
where pg_class.relnamespace = pg_namespace.oid

pg_namespace:存储命名空间

字段:
  oid: 主键
  nspname : 命名空间的名称

pg_inherits:记录有关表和索引继承层次结构的信息

字段:
  inhrelid :子表或索引的 OID
  inhparent: 父表或索引的 OID
/*查询库中所有表继承关系*/
select concat('alter table ', child_table, ' no inherit ', parent_table, ';') from (
select
child_class.relname child_table,
parent_class.relname parent_table
from pg_class child_class inner join pg_inherits child_inherits 
  on child_inherits.inhrelid = child_class.oid
  inner join pg_class parent_class 
  on child_inherits.inhparent = parent_class.oid
  where child_class.relnamespace = 2200
   and child_class.relkind = 'r') a;


/**查询被继承得所有表*/
select 	concat('drop table ', dtable  , ';') from (
  select DISTINCT pg_class.relname dtable
  from pg_class inner join pg_inherits 
  on pg_inherits.inhparent = pg_class.oid 
  where pg_class.relnamespace = 2200
  and relkind = 'r') b;

pg_attribute:存储有关表列的信息

字段:
  attrelid:此列所属的表 参考资料pg_class.oid
  attname: 列名称
  attnum :  列的编号。普通列的编号从 1 开始
/*查询表中所有字段*/
select pg_attribute.attname  字段名
from pg_attribute  left join pg_class 
on pg_attribute.attrelid = pg_class.oid
where pg_attribute.attnum >= 1
  and pg_class.relnamespace = 2200
  and relkind = 'r'
  and pg_class.relname = 'tabletest'

/*查询一个表中有另一个表中没有的字段*/
select pg_attribute.attname 字段名
from pg_attribute left join pg_class 
on pg_attribute.attrelid = pg_class.oid
where pg_attribute.attnum >= 1
  and pg_class.relnamespace = 2200
  and relkind = 'r'
  and pg_class.relname = '表1'
  and pg_attribute.attname not in (
  select pg_attribute.attname 字段名
  from pg_attribute left join pg_class 
  on pg_attribute.attrelid = pg_class.oid
  where pg_attribute.attnum >= 1
       and pg_class.relnamespace = 2200
       and relkind = 'r'
       and pg_class.relname = '表2');

pg_aggregate :存储有关聚合函数的信息

常用方法和函数

SQL字符串函数和运算符:
连接两个字符串: text || text    
连接所有参数的文本表示形式。NULL 参数将被忽略: concat('abcde', 2, NULL, 22)→abcde222
用分隔符连接除第一个参数之外的所有参数: concat_ws(',', 'abcde', 2, NULL, 22)→abcde,2,22
返回字符串中的字符数: char_length ( text)  
根据数据库区域设置的规则将字符串转换为全部小写: lower ( text)  
根据数据库区域设置的规则将字符串转换为全部大写: upper('tom')→TOM
替换字符串: overlay('Txxxxas' placing 'hom' from 2 for 4)→Thomas
将查询出来列的数据拼接一起:string_agg(distinct project.project_name, ',') project_name
数据类型格式化函数
根据给定格式将时间戳转换为字符串: to_char(timestamp '2002-04-20 17:31:12.66', 'HH24:MI:SS')17:31:12
根据给定格式将间隔转换为字符串:  to_char(interval '15h 2m 12s', 'HH24:MI:SS')15:02:12
根据给定格式将字符串转换为日期:  to_date('05 Dec 2000', 'DD Mon YYYY')2000-12-05
根据给定格式将字符串转换为数字:   to_number('12,454.8-', '99G999D9S')-12454.8
根据给定格式将字符串转换为时间戳: to_timestamp('05 Dec 2000', 'DD Mon YYYY')2000-12-05 00:00:00-05
日期/时间运算符
向日期添加天数(date + integer):  date '2001-09-28' + 72001-10-05
向日期添加间隔(date + interval):  date '2001-09-28' + interval '1 hour'2001-09-28 01:00:00
减去日期,得出经过的天数(date - date):  date '2001-10-01' - date '2001-09-28'3
从日期中减去天数(date - integer): date '2001-10-01' - 72001-09-24
日期/时间函数
当前日期: current_date
一天中的当前时间: current_time
当前日期和时间: current_timestamp
函数date_part,获取日期相差天数:
   date_part('day', cast(now() as TIMESTAMP) - cast(last_task_plan_date as TIMESTAMP)) as day_num
EXTRACTdate_part

EXTRACT(field FROM source) : 该函数从日期/时间值中检索子字段,例如年或小时。

dow(星期日 到星期六,为星期几):  SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');

doy(一年中的某一天 (1365/366): SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40');

year(年份字段): SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40');

hour(小时字段 (023): SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');

minute(分钟字段 (059): SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40');
month(月份数 (112): SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40');

条件表达式
/*-----CASE---- */
SELECT a,
       CASE WHEN a=1 THEN 'one'
            WHEN a=2 THEN 'two'
            ELSE 'other'
       END
    FROM test;

/*-----COALESCE
   该函数返回其第一个不为 null 的参数----*/
SELECT COALESCE(NULL, 'TESTHHH', '(none)')

/*-----NULLIF
   如果值 1 等于值 2,则该函数返回空值;否则返回值 1----*/
SELECT NULLIF('HHHH', 'HHHH') 
<think>好的,我现在要解决用户在IAR编译器中遇到的错误:“incomplete type is not allowed”。首先,我需要理解这个错误的含义和常见原因。根据我的知识库,这个错误常发生在代码中使用了未完全定义的类型,比如结构体或联合体声明了但未定义,或者前向声明了某个类型但没有提供完整的定义。 首先,我应该检查用户代码中是否有结构体或联合体的声明但没有定义的情况。比如,如果有一个结构体声明为`struct MyStruct;`,但没有后续的完整定义,那么在需要该结构体大小或成员的地方,编译器就会报这个错误。这时候,需要用户补全结构体的定义,包括成员变量。 其次,检查是否在头文件中只声明了类型而没有包含定义。例如,如果在头文件中使用前向声明,但在使用该类型的源文件中没有包含实际的定义头文件,这也会导致错误。此时,需要确保在使用类型的地方包含了正确的头文件,或者将前向声明替换为完整的定义。 另外,还要考虑typedef的问题。如果用户使用了typedef创建别名,但原始类型未完全定义,同样会引发错误。例如,`typedef struct MyStruct MyType;`之后,如果尝试使用MyType但MyStruct尚未定义,就会出错。需要确保在使用typedef之前,原始类型已经被完整定义。 此外,数组声明中的类型不完整也是一个常见原因。比如声明数组时,如果元素类型未完全定义,编译器无法确定数组的大小,导致错误。需要检查数组声明中的类型是否已经完整定义。 可能还有其他情况,比如在C和C++混合编程时,如果没有正确使用extern "C",或者在头文件中遗漏了必要的包含,也可能导致类型不完整。需要用户检查这些方面。 接下来,我需要将这些可能的原因整理成清晰的解决步骤,并给出具体的代码示例,帮助用户理解如何修改。同时,根据用户提供的引用内容,虽然引用[1]和引用[2]是关于其他错误的,但用户可能希望看到类似的结构,即分点说明解决方案,并引用相关资源。 最后,生成相关问题,帮助用户进一步了解可能相关的编译错误,比如类型未定义、前向声明问题等。这样用户可以有更全面的认识,预防其他类似错误的发生。</think>### IAR编译器错误'incomplete type is not allowed'解决方案 该错误表示代码中使用了**未完全定义的类型**,编译器无法确定其内存布局或成员信息。以下是具体原因及解决方法: #### 1. 结构体/联合体未定义完整 若声明了结构体但未定义成员,在实例化时会报错: ```c struct MyStruct; // 前向声明不完整 struct MyStruct var; // 错误:使用未完成类型 ``` **解决方案**:补全类型定义 ```c struct MyStruct { int id; char name[20]; }; ``` #### 2. 头文件包含缺失 当跨文件使用类型时,需确保定义可见: ```c // file.h struct Data; // 前向声明 // file.c struct Data { // 实际定义 int value; }; ``` **解决方案**:在使用该类型的文件中包含定义头文件 ```c #include "file.c" // 包含实际定义 ``` #### 3. typedef别名问题 使用typedef时原始类型必须完整: ```c typedef struct Node NodeT; // 前向声明 NodeT* ptr; // 允许指针声明 NodeT instance; // 错误:不完整类型 ``` **解决方案**:先完成类型定义再typedef ```c struct Node { int data; struct Node* next; }; typedef struct Node NodeT; ``` #### 4. 数组声明不完整 数组元素类型必须完全定义: ```c struct Element; struct Element arr[10]; // 错误:元素类型未定义 ``` **解决方案**: ```c struct Element { int type; float value; }; struct Element arr[10]; // 合法 ``` #### 调试建议 1. 在IAR工程中搜索错误行号定位问题代码 2. 使用Go to Definition功能追踪类型定义 3. 检查所有头文件包含链 4. 确认没有循环依赖的头文件 编译器需要知道类型的完整信息才能: - 计算sizeof大小 - 分配内存空间 - 访问成员变量 - 进行类型对齐 [^1]: 类似类型转换错误可参考浮点转整型的类型适配问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值