SQL :查找字符在字符串值中的位置
SQL : Find the position of a character in a string value
我有一列包含以下示例值
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
开头时,这将不起作用,因为 LEVEL
是 1
并且 INSTR( 'YYYY', 'Y', 1, 1 )
是 1
然后过滤器是 CONNECT BY 1 < 1
这是不正确的。您要检查 CONNECT BY INSTR( MyColumn, 'Y', 1, LEVEL ) > 0
.
您还需要另一个过滤器来检查没有 Y
个字符的情况,因为分层查询总是 return 至少一行。
您可以调整查询以使用相关的子查询:
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
| 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) |
我有一列包含以下示例值
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
开头时,这将不起作用,因为 LEVEL
是 1
并且 INSTR( 'YYYY', 'Y', 1, 1 )
是 1
然后过滤器是 CONNECT BY 1 < 1
这是不正确的。您要检查 CONNECT BY INSTR( MyColumn, 'Y', 1, LEVEL ) > 0
.
您还需要另一个过滤器来检查没有 Y
个字符的情况,因为分层查询总是 return 至少一行。
您可以调整查询以使用相关的子查询:
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
| 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) |