이 기사에서는 SQL 서버에 대한 관련 지식을 제공합니다. 주로 SQL 사례 연구에서 문자열 병합 및 분할에 대한 관련 정보를 소개합니다. 또는 Oracle을 사용하여 학습하는 데 도움이 됩니다. 특정 참고 학습 가치가 있으면 도움이 필요한 친구가 참고할 수 있습니다.
추천 학습: "SQL Tutorial"
현재 제가 아는 두 가지 구현 방법이 있는데 구현 아래에 기록되어 있습니다. 둘 중:
SQL 구현:
--方法一 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;
실행 결과:
SQL 분석:
Oracle 자체 wm_concat() 함수 사용 단점이 있다 문자열을 병합할 때 병합을 위한 연결 기호는 기본 쉼표만 사용할 수 있으며 다른 기호는 사용할 수 없습니다.
SQL 구현:
--方法二 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;
실행 결과:
SQL 분석:
Oracle 자체 LISTAGG() 함수를 사용하여 문자열을 병합합니다. 장점은 병합된 연결 기호는 임의의 문자로 지정할 수 있으며 ORDER BY 정렬을 쉽게 구현할 수 있습니다.
Oracle에는 여러 가지 구현 방법이 있을 수 있습니다. 현재 제가 알고 있는 두 가지 구현 방법은 다음과 같습니다.
구현 SQL:
--方法一 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;
실행 결과:
SQL 분석:
다음은 단계별 설명입니다.
먼저 원본 버전을 살펴보세요. 영화 테이블 데이터:
1. 첫 번째 단계는 처음에 클래스 필드의 값을 구분 기호(여기서는 쉼표)에 따라 두 부분으로 분할하는 것입니다. 첫 번째 부분은 분할할 클래스 필드의 첫 번째 값이고, 두 번째 부분은 분할할 클래스 필드의 나머지 부분의 값입니다.
2. 두 번째 단계에서는 WITH 표현식을 사용하여 재귀 쿼리를 구현하고, 첫 번째 단계에서 분할되지 않은 값(두 번째 부분)을 구분 기호(여기서는 쉼표)에 따라 분할합니다. 필드의 마지막 구분 기호를 사용하고 재귀 종료 시 데이터는 임시 테이블 t에 배치됩니다.
3. 세 번째 단계는 두 번째 단계에서 임시 테이블 t의 레코드를 쿼리하고 정렬하는 간단한 쿼리입니다.
SQL 구현:
--方法二 SELECT m.name,t.column_value FROM movies m,TABLE(SPLIT(m.class,'、')) t;
실행 결과:
이 방법은 실제로 사용자 정의에 의한 것입니다. 함수( 함수)를 함수 분할의 논리는 실제로 방법 1의 논리와 유사합니다. 둘 다 재귀를 사용하여 문자열의 값을 구분 기호에 따라 하나씩 분할하고 마지막으로 분할 문자열을 반환합니다. 개인적으로 나는 이 방법이 분할 논리를 캡슐화하여 논리를 더 간단하고 명확하게 만들기 때문에 더 좋다고 생각합니다.
다음은 분할 함수 생성 스크립트입니다.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;
create or replace type tabletype as table of varchar2(32676);
SQL Tutorial
"위 내용은 SQL 사례 연구: 문자열 병합 및 분할의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!