Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Trả về tên cột Oracle ở định dạng table.column?

Không có "tùy chọn" nào trong Oracle để thực hiện việc này; bạn có thể có thể tìm thấy một ứng dụng khách cho phép bạn làm như vậy vì đây là công việc thường được thực hiện trong ứng dụng khách; Tôi không biết một cái.

Để mở rộng theo câu trả lời của tbone bạn sẽ phải làm điều này một cách linh hoạt. Điều này không nghĩa là bạn phải liệt kê mọi cột. Bạn sẽ sử dụng từ điển dữ liệu , cụ thể là all_tab_columns hoặc user_tab_columns để tạo truy vấn của bạn. Sẽ dễ dàng hơn khi tạo chế độ xem với định nghĩa chính xác bạn muốn để bạn có thể sử dụng lại nếu muốn.

Mục đích là sử dụng thực tế là sự tồn tại của cột được lưu trữ trong bảng dưới dạng chuỗi để tạo truy vấn sử dụng cột đó. Vì tên cột và tên bảng được lưu trữ dưới dạng chuỗi, bạn có thể sử dụng kỹ thuật tổng hợp chuỗi để dễ dàng tạo truy vấn hoặc câu lệnh DDL mà sau đó bạn có thể thực thi theo cách thủ công hoặc động.

Nếu bạn đang sử dụng Oracle 11g Release 2, listagg chức năng có sẵn để giúp bạn:

select 'create or replace view my_view as 
        select '
      || listagg( table_name || '.' || column_name 
               || ' as ' 
               || substr(table_name,1,1) || '_' 
               || column_name, ', ')
        within group 
         ( order by case when table_name = 'FOO' then 0 else 1 end
                  , column_id
          )
       || ' from foo f
            join bar b
              on f.id = b.foo_id'
  from user_tab_columns
 where table_name in ('FOO','BAR')
        ;

Giả sử cấu trúc bảng này:

create table foo ( id number, a number, b number, c number);
create table bar ( foo_id number, a number, b number, c number);

Truy vấn đơn này tạo ra như sau:

create or replace view my_view as 
 select FOO.ID as F_ID, FOO.A as F_A, FOO.B as F_B, FOO.C as F_C
      , BAR.FOO_ID as B_FOO_ID, BAR.A as B_A, BAR.B as B_B, BAR.C as B_C 
   from foo f 
   join bar b on f.id = b.foo_id

và đây là SQL Fiddle để chứng minh điều đó.

Khi bạn không sử dụng 11.2, bạn có thể đạt được kết quả chính xác bằng cách sử dụng hàm không có tài liệu wm_concat hoặc hàm do người dùng xác định stragg , được tạo ra bởi Tom Kyte. Oracle Base có một bài viết về kỹ thuật tổng hợp chuỗi và có nhiều bài đăng trên Stack Overflow.

Như một phụ lục nhỏ, bạn thực sự có thể tạo chính xác những gì bạn đang tìm kiếm với một thay đổi nhỏ đối với truy vấn ở trên. Bạn có thể sử dụng số nhận dạng được trích dẫn để tạo một cột trong TABLE_NAME.COLUMN_NAME định dạng. Bạn để trích dẫn nó là . không phải là một ký tự hợp lệ cho một tên đối tượng trong Oracle. Lợi ích của việc này là bạn đạt được chính xác những gì bạn muốn. Nhược điểm là việc truy vấn chế độ xem đã tạo là một khó khăn lớn nếu bạn không sử dụng select * from ...; việc chọn các cột được đặt tên sẽ yêu cầu chúng sẽ được trích dẫn.

select 'create or replace view my_view as
        select '
      || listagg( table_name || '.' || column_name 
               || ' as ' 
               || '"' || table_name || '.'
               || column_name || '"', ', ')
        within group 
         ( order by case when table_name = 'FOO' then 0 else 1 end
                  , column_id
          )
       || ' from foo f
            join bar b
              on f.id = b.foo_id'
  from user_tab_columns
 where table_name in ('FOO','BAR')
        ;

Truy vấn này trả về :

create or replace view my_view as 
 select FOO.ID as "FOO.ID", FOO.A as "FOO.A", FOO.B as "FOO.B", FOO.C as "FOO.C"
      , BAR.FOO_ID as "BAR.FOO_ID", BAR.A as "BAR.A"
      , BAR.B as "BAR.B", BAR.C as "BAR.C"
   from foo f 
   join bar b on f.id = b.foo_id


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm nạp giá trị trả về mảng pl / sql trong java

  2. Oracle - Tại sao số 0 đứng đầu của một số biến mất khi chuyển đổi nó thành TO_CHAR

  3. TNS-12505:TNS:người nghe hiện không biết về SID được cung cấp trong bộ mô tả kết nối

  4. Mệnh đề SQL IN 1000 giới hạn mục

  5. Dán các biểu tượng tiếng Trung vào oracle DB