我有一列具有以下示例值

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 行。如何解决这个问题?为什么它不起作用?

最佳答案

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

它也有:

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

当字符串以 Y 开头时,这将不起作用,因为 LEVEL1 并且 INSTR( 'YYYY', 'Y', 1, 1 )1,然后过滤器是 CONNECT BY 1 < 1 这不是真的。您想检查 CONNECT BY INSTR( MyColumn, 'Y', 1, LEVEL ) > 0

您还需要另一个过滤器来检查没有 Y 字符的情况,因为分层查询将始终返回至少一行。

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

SQL Fiddle

Oracle 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) |

关于SQL : Find the position of a character in a string value,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47793100/

10-11 22:14
查看更多