Oracle排除某个字段查询
情景
在写查询语句时,可能会遇到这种场景:怎么排除某个字段查询表数据,这种情况特别是在当表字段特别多的时候,如果一个字段一个字段写
select t.a,t.b,t.c,t.xx ... from table_name t
特别麻烦,还容易写漏掉。
- 解决思路
- 先获取到所有字段的查询语句
- 去掉不需要的字段即可
开始前先看常规查询
常规查询
查询所有字段
select * from table_name
查询几个字段
select t.name,t.password,t.tel from table_name t
排除某个字段查询
获取所有表字段
SELECT
'select ' || a.cols || ' from ' || a.table_name as sqlstring
FROM
(
SELECT
t.table_name,
LISTAGG( t.COLUMN_NAME,',') WITHIN GROUP ( ORDER BY t.COLUMN_NAME ) cols
FROM
user_tab_columns t
WHERE
t.TABLE_NAME = 'SR_SPONSOR' -- 表名称
GROUP BY
t.table_name
) a;
获取到查询所有字段的语句
这样不需要自己一个一个去写,去掉不需要的字段即可,还可以创建成函数,方便后期使用
select PID,REPSONSIBILITY_ID,SIGNATURE,SIGNATURE_TIME,SPONSOR,SPONSOR_ID,SPONSOR_JOB,SPONSOR_ORG from SR_SPONSOR
oracle listagg() 列转行函数
该函数可以实现按条件实现列转行:
基础的用法如下:
LISTAGG(a,b) WITHIN GROUP( ORDER BY c)
- a:需要拼接的数据表中的字段
- b:以什么字符分割,例如逗号,分号等字符
- c
b
与c
是相同的字段
它的用法就像聚合函数一样,通过Group by语句,把每个Group的一个字段,拼接起来。
例如:
SELECT LISTAGG(t.name, ',') within group(ORDER BY t.name) FROM t_employee t ;
查询结果:
name1,name2,name3