这是我的学生表:
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)
虽然不行.有人可以告诉我为什么吗?
LIKE比REGEXP_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)
有很多方法可以解决这个问题,包括:
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'.