在oracle中列出名字的第二个字符是'a'的学生

Adi*_*osh 1 regex sql oracle

这是我的学生表:

11  sourav  01-JUN-10
12  kamal   01-JUN-10
13  RAHUL   01-JUN-10
14  SOVAN   01-DEC-10
15  SHAYMAL 01-DEC-10
Run Code Online (Sandbox Code Playgroud)

我试图找到名字,其第二个字符是'A'.我为它写了以下SELECT:

SELECT 
    name
FROM 
    student
WHERE 
    REGEXP_LIKE(name,'[a-z]a.*','i');
Run Code Online (Sandbox Code Playgroud)

虽然不行.有人可以告诉我为什么吗?

Gor*_*off 9

LIKEREGEXP_LIKE()这更好:

where name like '_a%'
Run Code Online (Sandbox Code Playgroud)

如果您需要不区分大小写,则可以执行以下操作:

where lower(name) like '_a%'
Run Code Online (Sandbox Code Playgroud)

LIKE 模式始终在字符串的开头匹配.

作为正则表达式,您可以:

where regexp_like(name, '^.a')
Run Code Online (Sandbox Code Playgroud)

^正则表达式锚定到字符串的开头.将.匹配任何单个字符.

如果您希望此不区分大小写,则可以使用:

where regexp_like(name, '^.[aA]')
Run Code Online (Sandbox Code Playgroud)


MT0*_*MT0 8

有很多方法可以解决这个问题,包括:

SELECT NAME
FROM   STUDENT
WHERE  LOWER( NAME ) LIKE '_a%';
Run Code Online (Sandbox Code Playgroud)

要么

SELECT NAME
FROM   STUDENT
WHERE  NAME LIKE '_a%'
OR     NAME LIKE '_A%';
Run Code Online (Sandbox Code Playgroud)

要么

SELECT NAME
FROM   STUDENT
WHERE  SUBSTR( LOWER( NAME ), 2, 1 ) = 'a';
Run Code Online (Sandbox Code Playgroud)

要么

SELECT NAME
FROM   STUDENT
WHERE  INSTR( LOWER( NAME ), 'a', 2 ) = 2;
Run Code Online (Sandbox Code Playgroud)

要么

SELECT NAME
FROM   STUDENT
WHERE  REGEXP_LIKE( NAME, '^.a', 'i' );
Run Code Online (Sandbox Code Playgroud)

虽然不行.有人可以告诉我为什么吗?

正则表达式'[a-z]a.*'不会锚定到字符串的开头,因此它将匹配字母字符,后跟a字符串中的任何字符.如果只想查找第二个字符,则需要启动与^字符串开头匹配的正则表达式.

WHERE  REGEXP_LIKE( NAME, '^[a-z]a', 'i' );
Run Code Online (Sandbox Code Playgroud)

您不需要匹配字符串的其余部分,因此附加.*是多余的.

此外,只匹配[a-z]作为第一个字符可能适用于您将遇到的匹配此模式的大多数名称,但它不会匹配名称:重音的第一个字符; 或者首先是扩展字符集中的字符; 或者用数字或标点符号作为第一个字符.通过使用正则表达式,可以使正则表达式更加宽松'^.a'.