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

chia chuỗi thành nhiều hàng

Từ nhận xét của bạn đến câu trả lời @PrzemyslawKruglej

Vấn đề chính là với truy vấn nội bộ với connect by , nó tạo ra số lượng hàng đáng kinh ngạc

Số lượng hàng được tạo có thể được giảm bớt bằng cách tiếp cận sau:

Bảng kiểm tra
/* test table populated with sample data from your question */
SQL> create table t1(str) as(
  2    select 'a;b;c'  from dual union all
  3    select 'b;c;d'  from dual union all
  4    select 'a;c;d'  from dual
  5  );
Table created

--  number of rows generated will solely depend on the most longest 
--  string. 
--  If (say) the longest string contains 3 words (wont count separator `;`)
--  and we have 100 rows in our table, then we will end up with 300 rows 
--  for further processing , no more.
with occurrence(ocr) as( 
  select level 
    from ( select max(regexp_count(str, '[^;]+')) as mx_t
             from t1 ) t
    connect by level <= mx_t 
)
select count(regexp_substr(t1.str, '[^;]+', 1, o.ocr)) as generated_for_3_rows
  from t1
 cross join occurrence o;

Kết quả: Đối với ba hàng trong đó hàng dài nhất được tạo thành từ ba từ, chúng tôi sẽ tạo ra 9 hàng :

GENERATED_FOR_3_ROWS
--------------------
                  9

Truy vấn cuối cùng:

with occurrence(ocr) as( 
  select level 
    from ( select max(regexp_count(str, '[^;]+')) as mx_t
             from t1 ) t
    connect by level <= mx_t 
)
select res
     , count(res) as cnt
  from (select regexp_substr(t1.str, '[^;]+', 1, o.ocr) as res
          from t1
         cross join occurrence o)
 where res is not null
 group by res
 order by res;

Kết quả:

RES          CNT
----- ----------
a              2
b              2
c              3
d              2

Bản trình diễn SQLFIddle

Tìm hiểu thêm về hàm regexp_count () (11g trở lên) và regexp_substr () các hàm biểu thức chính quy.

Lưu ý: Các hàm biểu thức chính quy tương đối tốn kém để tính toán và khi cần xử lý một lượng rất lớn dữ liệu, có thể đáng xem xét chuyển sang một PL / SQL thuần túy. Đây là một ví dụ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để gọi hàm Oracle hoặc thủ tục được lưu trữ bằng cách sử dụng khuôn khổ bền vững mùa xuân?

  2. Làm thế nào để triển khai các mối quan hệ một-một, một-nhiều và nhiều-nhiều trong khi thiết kế bảng?

  3. Cách sao lưu máy ảo RAC

  4. Phân vùng chia nhanh

  5. Batch nhiều câu lệnh lựa chọn khi gọi Oracle từ ADO.NET