2011-09-03 6 views
-3

SQL과 PL/SQL을 사용하고 있습니다.SQL 쿼리 생성

"name"이라는 단일 열이있는 테이블이 있습니다. 이 열의 데이터는 세미콜론으로 구분 된 문자열입니다. 각 행의 요소 수를 계산하고 싶습니다.

예를 들어, 'smith; black; tiger'문자열과 'x; y'문자열이있는 테이블에 두 개의 행이있는 경우 쿼리의 결과를 첫 번째 행과 두 번째 행의 경우 2입니다.

분리 된 값 목록의 요소 수를 계산하는 SQL 쿼리를 작성하려면 어떻게해야합니까?

+5

CSV 아주 나쁜 :이 같은 GROUP BY 문 "항목 테이블의 각 행에 해당 얼마나 많은 이름" 생각. 그것은 표준화되지 않았습니다, 느립니다, 당신은 인덱스를 사용할 수없고 조인은 고통입니다. 절대로하지 마십시오. – Johan

+0

데이터베이스 플랫폼은 무엇입니까? – harpo

+0

데이터베이스 테이블에 "첫 번째 행"이 없습니다. 주문은 결코 보장되지 않습니다. –

답변

4

당신이 코드를 데이터베이스에
CSV는 아주 나쁜 안티 패턴

SELECT name 
     ,(LENGTH(COALESCE(vals,'')) 
     - LENGTH(TRANSLATE(COALESCE(vals,''), ';',''))) + 1 AS value_count 
FROM table1 
ORDER BY name 

비고

SQL 코드의 공포를 사용하여이 해킹 할 수 있습니다.
VALUES은 예약어이므로 예약어 다음에 열 이름을 지정하는 것은 좋지 않습니다.

6

귀하의 질문은 이해하기 어렵지만, "이름"열이있는 테이블이 있고 그 열 안에는 각 셀에 세미콜론으로 구분 된 여러 값이 들어 있다고 생각합니다. 각 행에서 세미콜론으로 구분 된 값의 수를 계산하려고합니다.

PLSQL string functions이 여기에 도움이 될 수 있지만 실제로이 작업을 수행하는 프로그램 코드를 작성하는 것에 대해 이야기하고 있습니다. (일반적으로 데이터베이스 쿼리 언어에서는 작동하지 않습니다.) 예를 들어, 세미콜론의 수를 계산 this trick를 사용하고 하나를 추가 할 수 있습니다

LENGTH(name) - LENGTH(TRANSLATE(name,'x;','x')) + 1 

을하지만 @Johan이 제작되는 지점이 당신의 데이터를 구조화하는 나쁜 방법이라는 것이다. 예를 들어 이름으로 제대로 조회 할 수 없습니다. 이름이 "smith"이 아니기 때문에 where name == "smith"이라고 할 수는 없습니다. "smith;black;tiger"과 같습니다. where name like "smith"이라는 하위 문자열 검색을 수행해야하며 이는 비효율적이며 잘못 될 것입니다. 내가 "smi"라는 이름을 찾아달라고하면 어떻게 될까? where name like "smi"이라고 말하면 그 결과를 잘못 찾습니다. "smith"는 테이블에 있지만 "smi"는 그렇지 않습니다. 왜냐하면 둘 다 "smith; black; tiger"의 부분 문자열이기 때문입니다.

항목이 여러 개의 이름을 갖게하려면 훨씬 더 나은 해결책입니다. 항목에 고유 한 ID를 부여하는 것입니다. 123 (SQL에 테이블 행에 대한 고유 ID를 자동으로 생성하도록 요청할 수 있습니다.) 그런 다음 해당 행으로 다시 매핑되는 이름에 대해 별도의 테이블을 보유하십시오. 아이디 (123)과 행 그래서 당신은 "호랑이; 블랙 스미스를"준 말 "X를, y는"이제 두 개의 열이 다른 테이블 NameMap을했을 ID 124 행 : 이제

name | entry 
------------------ 
smith | 123 
black | 123 
tiger | 123 
x  | 124 
y  | 124 

당신이 볼 수 이름을 테이블에 맵핑하고이를 조인과 함 2 이름 항목 테이블에 맵핑하십시오.

그리고 당신은 당신의 질문에 대답 할 수 있습니다 :

데이터베이스 열에서
SELECT name, count(*) as value_count FROM NameMap GROUP BY name