Rumah  >  Artikel  >  pangkalan data  >  Kajian kes SQL: menggabungkan dan membelah rentetan

Kajian kes SQL: menggabungkan dan membelah rentetan

WBOY
WBOYke hadapan
2022-09-01 14:44:382597semak imbas

Artikel ini membawa anda pengetahuan yang berkaitan tentang pelayan SQL terutamanya memperkenalkan anda kepada maklumat yang berkaitan tentang penggabungan dan pemisahan rentetan dalam kajian kes SQL nilai rujukan tertentu untuk semua orang belajar atau menggunakan Oracle Rakan yang memerlukan boleh merujuk kepadanya.

Kajian kes SQL: menggabungkan dan membelah rentetan

Kajian yang disyorkan: "Tutorial SQL"

Gabungan rentetan

Laksanakan SQL:

Hasil pelaksanaan:

--方法一
SELECT d.dept_name,wm_concat(e.emp_name) FROM employee e
INNER JOIN department d ON d.dept_id=e.dept_id
GROUP BY d.dept_name;

Analisis SQL:

Gunakan fungsi wm_concat() Oracle untuk menggabungkan rentetan Terdapat kelemahan di sini Simbol sambungan yang digabungkan hanya boleh menjadi koma lalai, dan simbol lain tidak boleh digunakan.

Kaedah penggabungan rentetan dua:

Laksanakan SQL:

Hasil pelaksanaan:

--方法二
SELECT d.dept_name,
LISTAGG (e.emp_name, ',') WITHIN GROUP (ORDER BY e.emp_name) names
FROM employee e
INNER JOIN department d ON d.dept_id=e.dept_id
GROUP BY d.dept_name;

Analisis SQL:

Gunakan fungsi LISTAGG() Oracle sendiri untuk menggabungkan rentetan ialah simbol sambungan yang digabungkan boleh ditentukan ialah sebarang aksara, dan ORDER BY sorting boleh dilaksanakan dengan mudah.

Pembahagian rentetan

Mungkin terdapat pelbagai kaedah pelaksanaan dalam Oracle, yang saya tahu setakat ini Terdapat dua jenis. Pelaksanaan kedua-dua jenis ini direkodkan di bawah:

Kaedah pemisahan rentetan satu:

Melaksanakan SQL:

Keputusan pelaksanaan:

--方法一
WITH  t (id, name, sub, str) AS (
    SELECT id, name, substr(class, 1, instr(class, '、')-1), substr(concat(class,'、'), instr(class, '、')+1) 
    FROM movies
    
    UNION ALL
    
    SELECT id, name,substr(str, 1, instr(str, '、')-1), substr(str, instr(str, '、')+1)
    FROM t WHERE instr(str, '、')>0
) 
 
SELECT id, name, sub
FROM t
ORDER BY id;

Analisis SQL:

Pernyataan ini adalah sedikit rumit -Penjelasan langkah. :

Pertama lihat data asal jadual filem:

1 medan mengikut pemisah (di sini ialah No. jeda) pada mulanya dibahagikan kepada dua bahagian. Bahagian pertama ialah nilai pertama medan kelas yang akan dipecahkan, dan bahagian kedua ialah nilai bahagian baki kelas yang akan dipecahkan.

2. Langkah kedua menggunakan ungkapan WITH untuk melaksanakan pertanyaan rekursif dan menggelungkan nilai yang tidak dipisahkan dalam langkah pertama mengikut pembatas (di sini ialah koma) ( Bahagian 2) Pisahkan sehingga pembatas terakhir medan, dan data pada penghujung rekursi diletakkan dalam jadual sementara t.

3. Langkah ketiga ialah pertanyaan mudah untuk membuat pertanyaan dan mengisih rekod daripada jadual t sementara dalam langkah kedua.

Kaedah pemisahan rentetan dua:

Laksanakan SQL:

Laksanakan Keputusan:

--方法二
SELECT m.name,t.column_value FROM movies m,TABLE(SPLIT(m.class,'、')) t;

Analisis SQL:

Kaedah ini sebenarnya diproses dengan menyesuaikan fungsi untuk rentetan fungsi split sebenarnya serupa dengan logik kaedah 1. Kedua-duanya menggunakan rekursi untuk membahagikan nilai dalam rentetan satu demi satu mengikut pembatas, dan akhirnya mengembalikan rentetan split. Secara peribadi, saya rasa kaedah ini lebih baik kerana ia merangkumi logik pemisahan, menjadikannya lebih mudah digunakan dan lebih jelas dalam logik.

Berikut ialah skrip penciptaan fungsi split:

Jenis nilai pulangan fungsi, tabletype, juga merupakan jenis tersuai.

Berikut ialah skrip penciptaan jenis ini:

create or replace function split (p_list clob, p_sep varchar2 := ',')
  return tabletype
  pipelined
 
is
  l_idx    pls_integer;
  v_list  varchar2 (32676) := to_char(p_list);
begin
  loop
      l_idx  := instr (v_list, p_sep);
 
      if l_idx > 0
      then
        pipe row (substr (v_list, 1, l_idx - 1));
        v_list  := substr (v_list, l_idx + length (p_sep));
      else
        pipe row (v_list);
        exit;
      end if;
  end loop;
end;
Pembelajaran yang disyorkan: "

Tutorial SQL

"

Atas ialah kandungan terperinci Kajian kes SQL: menggabungkan dan membelah rentetan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:jb51.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam