2017-12-13 7 views
4

에서 문자의 위치를 ​​찾습니다.SQL : 나는 샘플 내가 SQL SELECT 문을 통해 'Y'의 위치를 ​​표시 할</p> <pre><code>MyColumn ---------- NNNNNYYNNNNNYYNNNNNYYNNNNNYYNNN NNYYNNNNNYYNNNNNYYNNNNNYYNNN YYNNNNNYYNNNNNYYNNNNNYYNNNNNYY YYNNNNNYYNNNNNYYNNNNNYYNNNNNYYN </code></pre> <p>값 아래에있는 열이 문자열 값

다음은 내 SQL 쿼리입니다. 쿼리는 3, 4 행에 대해 작동하지 않습니다

Y_Position 
------------ 
6 7 13 14 20 21 27 28 
3 4 10 11 17 18 24 25 
1 
1 

쿼리의

SELECT LISTAGG(instr(MyColumn, 'Y', 1, level), ' ') WITHIN 
GROUP(
ORDER BY level) 
    FROM dual 
CONNECT BY level < instr(MyColumn, 'Y', 1, level) Y_Position from MyTable; 

출력이다. 이 문제를 해결하는 방법? 왜 작동하지 않는거야?

답변

4

두 개의 FROM 절 중 하나에 일치하는 SELECT 절이 없으므로 쿼리에 잘못된 구문이 있습니다.

또한이 : 문자열이 1YLEVEL로 시작하여 INSTR('YYYY', 'Y', 1, 1)1하고 다음 필터가 진실하지 않은 CONNECT BY 1 < 1 때 작동하지 않습니다

CONNECT BY level < instr(MyColumn, 'Y', 1, level) 

. CONNECT BY INSTR(MyColumn, 'Y', 1, LEVEL) > 0을 확인하고 싶습니다.

Y 문자가없는 경우에도 계층 적 쿼리로 항상 적어도 하나의 행을 반환하는 경우 다른 필터가 필요합니다.

당신은 상관 하위 쿼리를 사용하도록 쿼리를 적용 할 수

:

SQL Fiddle

오라클 11g R2 스키마 설정 :

CREATE TABLE MyTable(MyColumn) AS 
SELECT 'NNNNNYYNNNNNYYNNNNNYYNNNNNYYNNN' FROM DUAL UNION ALL 
SELECT 'NNYYNNNNNYYNNNNNYYNNNNNYYNNN' FROM DUAL UNION ALL 
SELECT 'YYNNNNNYYNNNNNYYNNNNNYYNNNNNYY' FROM DUAL UNION ALL 
SELECT 'YYNNNNNYYNNNNNYYNNNNNYYNNNNNYYN' FROM DUAL UNION ALL 
SELECT 'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN' FROM DUAL 

검색어 1 :

SELECT (
     SELECT LISTAGG(INSTR(t.MyColumn, 'Y', 1, LEVEL), ' ') 
        WITHIN GROUP (ORDER BY LEVEL) 
     FROM DUAL 
     WHERE INSTR(t.MyColumn, 'Y') > 0 
     CONNECT BY INSTR(t.MyColumn, 'Y', 1, LEVEL) > 0 
     ) AS Y_position 
FROM Mytable t 

Results :

|    Y_POSITION | 
|---------------------------| 
|  6 7 13 14 20 21 27 28 | 
|  3 4 10 11 17 18 24 25 | 
| 1 2 8 9 15 16 22 23 29 30 | 
| 1 2 8 9 15 16 22 23 29 30 | 
|     (null) |