Sql 查找第一个字母为大写的列值

Sql 查找第一个字母为大写的列值,sql,oracle,Sql,Oracle,我有一张带有EID、ENAME、性别的EMP_信息表。我的目标是仅显示第一个字母为大写或大写的ENAME值 类似表格: EID ENAME GENDER 001 Samuel M 002 john M 003 susan F 004 CALEB M 所需输出,如: EID ENAME 001 Samuel 004 CALEB 我试过: SELECT EID, ENAME FROM EMP_INF

我有一张带有EID、ENAME、性别的EMP_信息表。我的目标是仅显示第一个字母为大写或大写的ENAME值

类似表格:

EID     ENAME     GENDER
001     Samuel    M
002     john      M
003     susan     F
004     CALEB     M
所需输出,如:

EID    ENAME
001    Samuel
004    CALEB
我试过:

SELECT EID, ENAME
FROM EMP_INFO
WHERE ENAME like '[A-Z]%';

但这只是给出一个空白输出。没有错误,没有警告,但也没有输出。我还使用了oracle sql developer。

oracle不支持类似于模式的
中的通配符。您可以改为使用正则表达式:

select EID , ENAME
from EMP_INFO
where regexp_like(ENAME, '^[A-Z]');
或者,您可以只比较第一个字符:

where substr(ENAME, 1, 1) BETWEEN 'A' AND 'Z'
是此版本的工作示例


默认情况下,Oracle是区分大小写的,因此大多数Oracle系统都可以使用这些字符。

Oracle不支持类似于
模式的
中的通配符。您可以改为使用正则表达式:

select EID , ENAME
from EMP_INFO
where regexp_like(ENAME, '^[A-Z]');
或者,您可以只比较第一个字符:

where substr(ENAME, 1, 1) BETWEEN 'A' AND 'Z'
是此版本的工作示例


默认情况下,Oracle是区分大小写的,因此大多数Oracle系统都可以使用这些功能。

我们有一个名为
initcap
的众所周知的函数:

SELECT EID, ENAME
  FROM EMP_INFO
 WHERE substr(ENAME,1,1) = substr(initcap(ENAME),1,1);
或者使用:

SELECT EID, ENAME
  FROM EMP_INFO
 WHERE ENAME between chr(65) and chr(92);  

我们有一个著名的函数,名为
initcap
,非常重要:

SELECT EID, ENAME
  FROM EMP_INFO
 WHERE substr(ENAME,1,1) = substr(initcap(ENAME),1,1);
或者使用:

SELECT EID, ENAME
  FROM EMP_INFO
 WHERE ENAME between chr(65) and chr(92);  

您可以尝试以下方法(假设您没有尝试):

选择eid,ename
来自emp_信息
其中ename>='A'
和ename
这将确保
ename
的第一个字符介于
A
Z
之间。
CHR(ASCII('Z')+1)
的值是
[
,但这并不十分重要-我认为在这种情况下使用函数比使用“魔法字符”更清楚

编辑:之所以这样做,是因为在许多字符集中,小写字符作为一个组出现在大写字符之后*,因此只要
ename
的值介于
a
Z
之间,根据典型的字符串比较,它将以大写字符开头


*例如,和。我怀疑此解决方案可能不适用于EBCDIC字符集,但我手头没有一台服务器可以确认这一怀疑。

您可以尝试以下方法(假设您没有):

选择eid,ename
来自emp_信息
其中ename>='A'
和ename
这将确保
ename
的第一个字符介于
A
Z
之间。
CHR(ASCII('Z')+1)
的值是
[
,但这并不十分重要-我认为在这种情况下使用函数比使用“魔法字符”更清晰

编辑:之所以这样做,是因为在许多字符集中,小写字符作为一个组出现在大写字符之后*,因此只要
ename
的值介于
a
Z
之间,根据典型的字符串比较,它将以大写字符开头



*例如,和。我怀疑此解决方案可能不适用于EBCDIC字符集,但我手头没有一台服务器可以证实这一怀疑。

感谢Gordon提供的编辑部分和答案。我尝试了第一个,它工作正常。它给了我所需的输出。我还尝试了第二个,如图所示ror-“ORA-00920:无效的关系运算符”@Kaushik…在我看来没有什么问题,并且在我测试它时它可以工作。这是一个打字错误吗?LIKE中的通配符是“%”和“uxik”至少有人会误解你的说法。@GordonLinoff你的第一个查询,我认为它工作得很好。但是如果我稍微更改一下我的ename的格式,它会给出错误的答案。我的意思是我只想要那些第一个字母是大写的ename,类似REGEX_的查询会返回任何位置带有大写字母的ename。例如,我使用了meGHan,它也会将其作为输出返回。@Kaushik…如果它这样做,则您缺少模式开头的
^
。感谢Gordon的编辑部分以及答案。我尝试了第一个,它工作正常。它会给我所需的输出。我还尝试了第二个,显示错误-'ORA-00920:无效的关系运算符“@Kaushik…我看没有什么问题,在我测试它时它会正常工作。这是一个输入错误吗?LIKE中的通配符是“%”和“399;”至少有人会误解你的说法。@GordonLinoff你的第一个查询,我认为它工作得很好。但是如果我稍微更改一下我的ename的格式,它会给出错误的答案。我的意思是我只想要那些第一个字母是大写的ename,类似REGEX_的查询会返回任何位置带有大写字母的ename。例如,我使用了meGHan,它也将其作为输出返回。@Kaushik…如果它这样做,那么您将丢失模式开头的
^
。例如,如果
ENAME
等于
CAleb
,该怎么办?这是好还是坏?任何以大写字母开头的ENAME都可以计数。例如,在这种情况下,CAleb可以工作。如果
ENAME
等于
CAleb
,例如?这是好还是坏?任何以大写字母开头的ENAME都可以计数。例如,在这种情况下,CAleb可以工作。您只需在(INITCAP(ENAME),UPPER(ENAME))中执行
ENAME即可
@DavidFaber您好David,谢谢您的回答。它正在工作,并提供预期和期望的输出。干杯!@Kaushik…但我不明白您为什么接受这个。例如,它将拒绝
'McDonald'
。是的,它确实拒绝了我后来添加的一个Ename值ToNy。@Kaushik您看过SQL Fiddle演示了吗(最后一个安排适用于麦当劳或托尼)…?你可以在(INITCAP(ename),UPPER(ename))
@DavidFaber你好,David,谢谢你的回答。它正在工作,giv