oracle 抓取所有列,除了一些[重复]

vof42yt1  于 2023-11-17  发布在  Oracle
关注(0)|答案(2)|浏览(146)

此问题在此处已有答案

Can you SELECT everything, but 1 or 2 fields, without writer's cramp?(12个答案)
22天前关闭。
我有一个表,有很多列(大约50个)。我还有5个列,名字以expr_...开头。我想抓取除了expr_...列之外的所有列。我可以快速完成而不定义所有需要的列吗?
比如:

  1. SELECT
  2. * FROM TABLE WHERE column_name NOT LIKE '%EXPR%'

字符串
而不是:

  1. SELECT
  2. a, b, c, d, e, f, g, h, .... FROM table```

gopyfrb3

gopyfrb31#

PL/SQL提供了各种选项,最明显的是返回ref游标或自定义类型的函数。
然而,如果你想留在纯SQL中,你可以写一些代码来为你写代码。
包含多个expr_列的示例表:

  1. SQL> create table test as
  2. 2 select empno id, ename name, mgr, hiredate,
  3. 3 job expr_1, sal expr_2, deptno expr_3
  4. 4 from emp where rownum <= 5;
  5. Table created.
  6. SQL> select * From test;
  7. ID NAME MGR HIREDATE EXPR_1 EXPR_2 EXPR_3
  8. ---------- ---------- ---------- --------- --------- ---------- ----------
  9. 7369 SMITH 7902 17-DEC-80 CLERK 800 20
  10. 7499 ALLEN 7698 20-FEB-81 SALESMAN 1600 30
  11. 7521 WARD 7698 22-FEB-81 SALESMAN 1250 30
  12. 7566 JONES 7839 02-APR-81 MANAGER 2975 20
  13. 7654 MARTIN 7698 28-SEP-81 SALESMAN 1250 30

字符串
如果您查询user_tab_columns,将关键字与 desired 列的聚合列表连接起来(因为where子句消除了expr),结果就是您需要的:

  1. SQL> select 'select ' ||
  2. 2 listagg(column_name, ', ') within group (order by column_id) ||
  3. 3 ' from test' result
  4. 4 from user_Tab_columns
  5. 5 where table_name = 'TEST'
  6. 6 and column_name not like 'EXPR%';
  7. RESULT
  8. --------------------------------------------------------------------------------
  9. select ID, NAME, MGR, HIREDATE from test


最后,复制/粘贴上面的语句并执行它:

  1. SQL> select ID, NAME, MGR, HIREDATE from test;
  2. ID NAME MGR HIREDATE
  3. ---------- ---------- ---------- ---------
  4. 7369 SMITH 7902 17-DEC-80
  5. 7499 ALLEN 7698 20-FEB-81
  6. 7521 WARD 7698 22-FEB-81
  7. 7566 JONES 7839 02-APR-81
  8. 7654 MARTIN 7698 28-SEP-81

  • 将 * previous语句升级为create view,以便将其存储在数据库中,并从现在开始查询它(视图):
  1. SQL> create or replace view v_test as select ID, NAME, MGR, HIREDATE from test;
  2. View created.
  3. SQL> select * From v_test where name = 'SMITH';
  4. ID NAME MGR HIREDATE
  5. ---------- ---------- ---------- ---------
  6. 7369 SMITH 7902 17-DEC-80
  7. SQL>


下面是返回ref cursor* 选项的 * 函数(如果你认为你想要这样做;我不会,因为它不像以前发布的视图选项那样灵活):

  1. SQL> create or replace function f_test
  2. 2 return sys_refcursor
  3. 3 is
  4. 4 l_str varchar2(1000);
  5. 5 rc sys_refcursor;
  6. 6 begin
  7. 7 select 'select ' ||
  8. 8 listagg(column_name, ', ') within group (order by column_id) ||
  9. 9 ' from test'
  10. 10 into l_str
  11. 11 from user_Tab_columns
  12. 12 where table_name = 'TEST'
  13. 13 and column_name not like 'EXPR%';
  14. 14
  15. 15 open rc for l_str;
  16. 16 return rc;
  17. 17 end;
  18. 18 /
  19. Function created.


测试:

  1. SQL> select f_test from dual;
  2. F_TEST
  3. --------------------
  4. CURSOR STATEMENT : 1
  5. CURSOR STATEMENT : 1
  6. ID NAME MGR HIREDATE
  7. ---------- ---------- ---------- ---------
  8. 7369 SMITH 7902 17-DEC-80
  9. 7499 ALLEN 7698 20-FEB-81
  10. 7521 WARD 7698 22-FEB-81
  11. 7566 JONES 7839 02-APR-81
  12. 7654 MARTIN 7698 28-SEP-81
  13. SQL>

展开查看全部
vu8f3i0k

vu8f3i0k2#

您可以为此创建一个过程,并立即执行或输出到控制台进行编辑,然后像这样执行,并将EXAMPLE替换为您的表名:

  1. DECLARE
  2. v_sql VARCHAR2(1000);
  3. BEGIN
  4. v_sql := 'SELECT ';
  5. FOR col IN (
  6. SELECT column_name
  7. FROM all_tab_columns
  8. WHERE table_name = 'EXAMPLE'
  9. AND column_name NOT LIKE 'expr\_%' ESCAPE '\'
  10. ) LOOP
  11. v_sql := v_sql || col.column_name || ', ';
  12. END LOOP;
  13. -- Remove trailing comma and space
  14. v_sql := SUBSTR(v_sql, 1, LENGTH(v_sql) - 2);
  15. v_sql := v_sql || ' FROM EXAMPLE';
  16. -- Print or execute the constructed SQL query
  17. DBMS_OUTPUT.PUT_LINE(v_sql); -- Use DBMS_OUTPUT for printing print
  18. -- EXECUTE IMMEDIATE v_sql; -- Uncomment to execute the query
  19. END;

字符串
在执行任何动态创建的查询之前进行彻底的测试是非常重要的。
或者,只需这样做即可在键入时保存所有列名:

  1. SELECT column_name
  2. FROM all_tab_columns
  3. WHERE table_name = 'EXAMPLE'
  4. AND column_name NOT LIKE 'expr\_%' ESCAPE '\';

展开查看全部

相关问题