Sql 查找第一个字母为大写的列值
我有一张带有EID、ENAME、性别的EMP_信息表。我的目标是仅显示第一个字母为大写或大写的ENAME值 类似表格: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 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