所有
如何在T-Sql中检查指定的varchar字符或整个字符串是否为大写?理想情况下,我想编写一个函数来测试一个字符是否为大写,然后我可以将其应用于泛型varchar。对于非字母字符,它应该返回false。我只对英语字符感兴趣。
我正在使用SQL Management Studio中的T-sql,我尝试以这种方式从表中拉小写字母开始记录:
select * from TABLE
where SUBSTRING(author,1,1) != LOWER(SUBSTRING(author,1,1))
返回0条记录,但我知道有大写和小写字母的记录。
由于
编辑:由于podiluska和joachim-isaksoon都成功回答了我的问题(两种方法都适用于我的目的),有人会介意解释哪种方法最有效用于查询具有大量记录的表,以过滤掉以或不以大写字母开头的作者的记录?
答案 0 :(得分:31)
使用归类
例如:
if ('a'='A' Collate Latin1_General_CI_AI)
print'same 1'
else
print 'different 1'
if ('a'='A' Collate Latin1_General_CS_AI)
print'same 2'
else
print 'different 2'
排序规则名称中的CS表示区分大小写(以及CI,不区分大小写)。 AI / AS与重音敏感度有关。
或在您的示例中
SUBSTRING(author,1,1) <> LOWER(SUBSTRING(author,1,1)) COLLATE Latin1_General_CS_AI
答案 1 :(得分:12)
检查ch是否为大写,并且是可以在大写和小写之间转换的字符(即排除非字母字符);
WHERE UNICODE(ch) <> UNICODE(LOWER(ch))
答案 2 :(得分:1)
类似
declare @v varchar(10) = 'ABC', @ret int = 0
select @ret = 1 where upper(@v)=@v COLLATE SQL_Latin1_General_CP1_CS_AS
select @ret
答案 3 :(得分:0)
小写字母与大写字母具有相同的ASCII或UNICODE值,但小写字母的位标志设置为32。
这很容易直接检测,也可以将检测结果包装到用户定义的函数中,例如IsUpper()和IsLower()。
示例(请注意,ASCII()和UNICODE()在此处可互换使用):
DECLARE @Letter char(1);
SET @Letter = 'A'
PRINT
@Letter + space(1) +
CASE
WHEN (UNICODE(@Letter) & 32 > 0) THEN 'is lower case'
ELSE 'is UPPER CASE'
END
SET @Letter = 'z'
PRINT
@Letter + space(1) +
CASE
WHEN (ASCII(@Letter) & 32 > 0) THEN 'is lower case'
ELSE 'is UPPER CASE'
END
-- Output:
-- A is UPPER CASE
-- z is lower case
此函数将使用递归CTE在整个字符串中查找所有大写字母:
CREATE FUNCTION [dbo].[ContainsUpper](@InputString [varchar](80))
RETURNS [bit] WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @Result bit = 0,
@LowerString varchar(80) = lower(@InputString);
WITH Letters
AS
(
SELECT Position = 1,
IsUpper =
CASE unicode(left(@InputString,1))
WHEN unicode(left(@LowerString,1)) THEN 0
ELSE 1
END
UNION ALL
SELECT Position = Position + 1,
IsUpper =
CASE unicode(substring(@InputString, Position + 1, 1))
WHEN unicode(substring(@LowerString, Position + 1, 1)) THEN 0
ELSE 1
END
FROM Letters
WHERE Position < len(@InputString)
)
SELECT @Result = max(convert(int, IsUpper))
FROM Letters
RETURN @Result
END