>데이터 베이스 >SQL >SQL 사례 연구: 문자열 병합 및 분할

SQL 사례 연구: 문자열 병합 및 분할

WBOY
WBOY앞으로
2022-09-01 14:44:382652검색

이 기사에서는 SQL 서버에 대한 관련 지식을 제공합니다. 주로 SQL 사례 연구에서 문자열 병합 및 분할에 대한 관련 정보를 소개합니다. 또는 Oracle을 사용하여 학습하는 데 도움이 됩니다. 특정 참고 학습 가치가 있으면 도움이 필요한 친구가 참고할 수 있습니다.

SQL 사례 연구: 문자열 병합 및 분할

추천 학습: "SQL Tutorial"

String merging

현재 제가 아는 두 가지 구현 방법이 있는데 구현 아래에 기록되어 있습니다. 둘 중:

문자열 병합 방법 1:

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() 함수 사용 단점이 있다 문자열을 병합할 때 병합을 위한 연결 기호는 기본 쉼표만 사용할 수 있으며 다른 기호는 사용할 수 없습니다.

문자열 병합 방법 2:

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에는 여러 가지 구현 방법이 있을 수 있습니다. 현재 제가 알고 있는 두 가지 구현 방법은 다음과 같습니다.

문자열 분할 방법 1:

구현 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의 레코드를 쿼리하고 정렬하는 간단한 쿼리입니다.

문자열 분할 방법 2:

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;

함수의 반환값 유형인 tabletype도 사용자 정의 유형입니다.

다음은 이 유형의 생성 스크립트입니다.

create or replace type tabletype as table of varchar2(32676);

추천 학습: "

SQL Tutorial

"

위 내용은 SQL 사례 연구: 문자열 병합 및 분할의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 jb51.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제