Oracle排除某个字段查询

情景

在写查询语句时,可能会遇到这种场景:怎么排除某个字段查询表数据,这种情况特别是在当表字段特别多的时候,如果一个字段一个字段写select t.a,t.b,t.c,t.xx ... from table_name t特别麻烦,还容易写漏掉。

  • 解决思路
    1. 先获取到所有字段的查询语句
    2. 去掉不需要的字段即可

开始前先看常规查询

常规查询

查询所有字段

	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 bc是相同的字段

它的用法就像聚合函数一样,通过Group by语句,把每个Group的一个字段,拼接起来。

例如:

SELECT LISTAGG(t.name, ',') within group(ORDER BY t.name) FROM t_employee t ;

查询结果:

name1,name2,name3