SQL:在字符串值中查找字符的位置

时间:2017-12-13 12:30:56

标签: sql oracle position listagg

我有一个包含以下样本值的列

MyColumn
----------
NNNNNYYNNNNNYYNNNNNYYNNNNNYYNNN
NNYYNNNNNYYNNNNNYYNNNNNYYNNN
YYNNNNNYYNNNNNYYNNNNNYYNNNNNYY
YYNNNNNYYNNNNNYYNNNNNYYNNNNNYYN

我想通过SQL select语句显示'Y'的位置。

下面是我的SQL查询。

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;

查询的输出是,

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

查询不适用于第3行和第4行。如何解决这个问题?为什么不起作用?

1 个答案:

答案 0 :(得分:4)

您的查询语法无效,因为它有两个FROM子句,其中一个子句没有匹配的SELECT子句。

它还有:

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

当字符串以Y开头LEVEL1INSTR( 'YYYY', 'Y', 1, 1 )1,然后过滤器为{{1>这不是真的。您想要检查CONNECT BY 1 < 1

当没有CONNECT BY INSTR( MyColumn, 'Y', 1, LEVEL ) > 0个字符时,您还需要另一个过滤器来检查案例,因为分层查询总是会返回至少一行。

您可以调整查询以使用相关的子查询:

SQL Fiddle

Oracle 11g R2架构设置

Y

查询1

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

<强> Results

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