다른 열의 열에서 누락된 문자 목록을 찾는 방법 (How to find list of missing characters in a column from another column)


문제 설명

다른 열의 열에서 누락된 문자 목록을 찾는 방법 (How to find list of missing characters in a column from another column)

테이블이 두 개 있습니다. Tab_1.col_2에 문자가 있고 Tab2.col_2에 문자열이 있습니다.

Tab_1
col_1   col_2
1       A
2       B
3       C
4       N

Tab_2
col_1   col_2
101     CCNCCN
102     ABCNSN
103     TABGNN

Tab_1.col_2를 사용하여 Tab2.col_2를 검색하고 누락된 모든 문자를 식별하고 싶습니다.

이 두 테이블 간에 사용 가능한 조인 조건이 없습니다. Tab_2.col_2의 각 문자를 부분 문자열로 만든 다음 기능이 아닌 간단한 작업을 수행하려고 했습니다.

예상 결과:
Tab_1.col_2 ‑ T에서 누락된 두 문자가 출력될 것으로 예상합니다. 및 G를 두 행으로

Output:
T
G

참조 솔루션

방법 1:

One way is to use a recursive CTE stripping of leftmost char for leftmost char. The get the distinct set of that chars where the char doesn't exist in the set of single chars.

WITH
cte (c, r)
AS
(
SELECT substr(t2.col_2, 1, 1) c,
       substr(t2.col_2, 2, length(t2.col_2) ‑ 1) r
       FROM tab_2 t2
UNION ALL
SELECT substr(c.r, 1, 1) c,
       substr(c.r, 2, length(c.r) ‑ 1) r
       FROM cte c
       WHERE substr(c.r, 1, 1) IS NOT NULL
)
SELECT DISTINCT
       c.c
       FROM cte c
       WHERE NOT EXISTS (SELECT *
                                FROM tab_1 t1
                                WHERE t1.col_2 = c.c);

db<>fiddle

Maybe you can combine the idea of Gordon removing the existing chars with translate() first with the idea of stripping off the leftmost chars one by one to even get a shortcut without the need of the NOT EXISTS.

방법 2:

This is only half an answer.

You can remove the unwanted characters by using translate()

select translate(t2.col_2, rem || ' ', ' ')
from (select listagg(col_2, '') within group (order by col_2) as rem
      from table_1
     ) t cross join
     table_2 t2;

You can even aggregate these back together:

select listagg(translate(t2.col_2, rem || ' ', ' '), '') within group (order by rem)
from (select listagg(col_2, '') within group (order by col_2) as rem
      from table_1
     ) t cross join
     table_2 t2;

(by Carpediemsticky bitGordon Linoff)

참조 문서

  1. How to find list of missing characters in a column from another column (CC BY‑SA 2.5/3.0/4.0)

#oracle #SQL #plsql






관련 질문

Oracle SQL은 요일을 현재 날짜로 정렬합니다. (Oracle sql sort week days by current day)

3개의 변수가 있는 저장 프로시저 작성을 위한 plSQL 구문 (plSQL Syntax For Writing Stored Procedure w/ 3 Variables)

조건에 따라 SQL 쿼리의 UPDATE 문에서 값을 설정하기 위해 동적 열 이름을 설정하는 방법은 무엇입니까? (How to set dynamic column name to set value in UPDATE statement of SQL Query on the basis of condition?)

현재 회계 연도부터 sysdate까지 (Current Financial Year to sysdate)

카운트 최대 시퀀스 행 (Count Max Sequence row)

ORA-01008: 모든 변수가 바인딩되지 않았습니다(매개변수화된 쿼리가 있는 테이블 어댑터에서) (ORA-01008: not all variables bound (in table adapter with parameterized query))

ORA-00979: Oracle에 대한 GROUP BY 표현식이 아니지만 절 차이의 컨텍스트에서 MySQL에 대해서는 유효하지 않습니다. (ORA-00979: not a GROUP BY expression for Oracle but not valid for MySQL in context of clause difference)

#SQL #QUERY #ROWNUM #ORACLE (#SQL #QUERY #ROWNUM #ORACLE)

Oracle을 위한 IS숫자 대안 (ISNumeric Alternatives for Oracle)

다른 열의 열에서 누락된 문자 목록을 찾는 방법 (How to find list of missing characters in a column from another column)

18C 업그레이드의 일부로 OWA_UTIL.who_called_me에서 변경된 사항은 무엇입니까? (What are the changes done in OWA_UTIL.who_called_me as part of 18C upgrade?)

일부 값이 null인 경우 Oracle에서 날짜를 비교하시겠습니까? (Compare date in Oracle when some value is null?)







코멘트