测试大写字母T-Sql



全部,

如何在T-Sql中检查指定的varchar字符或整个字符串是否为大写?理想情况下,我想写一个函数来测试一个字符是否为大写,然后我可以稍后将其应用于泛型varchar。对于非字母字符,它应该返回false。我只对英文字符感兴趣。

我在sql Management Studio中使用T-sql,我尝试过以这种方式从表中提取以小写字母开头的记录:

select * from TABLE
where SUBSTRING(author,1,1) != LOWER(SUBSTRING(author,1,1))

它返回0条记录,但我知道有些记录以大写和小写字母开头。

感谢


编辑:既然podilska和joachim isaksoon都成功地回答了我的问题(这两种方法都适用于我的目的),有人介意解释一下,用哪种方法查询一个有大量记录的表,以过滤出作者以大写字母或不以大写字母开头的记录,这是最有效的方法吗?

使用排序规则

例如:

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

检查ch是否为大写,并且是一个可以在大写和小写之间转换的字符(即不包括非字母字符);

WHERE UNICODE(ch) <> UNICODE(LOWER(ch))

要测试的SQLfiddle;

类似的东西

declare @v varchar(10) = 'ABC', @ret int = 0
select @ret = 1 where upper(@v)=@v COLLATE SQL_Latin1_General_CP1_CS_AS
select @ret

小写字母的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

在PL/SQL中使用这两种方法检查字符串大小写的3个简单步骤

       1.Function 
       2.procedure

使用功能

步骤:1有两个可变

步骤:2一个是存储字符串,另一个是将字符串转换为大写

步骤:3检查条件if variable_one!=variable_convert然后显示字符串为小写,否则显示字符串为大写

set serveroutput on 
declare
        string_one varchar2(5);
        string_convert varchar2(5);
begin
        string_one:=&string;
        string_convert:=UPPER(string_one);
        if string_one != string_convert then
                dbms_output.put_line('string is lowercse');
        else
                dbms_output.put_line('string is UPPERCASE');
        end if;
end;
/

使用程序

check string是pl/sql中的一个大写或小写程序,使用过程逻辑是相同的,但不需要声明变量更改

 set serveroutput on 
            create or replace procedure upper_cse(str_one varchar2)
        is
    begin
            if str_one != UPPER(str_one) then
                    dbms_output.put_line('string is lowercse');
            else
                    dbms_output.put_line('string is UPPERCASE');
            end if;
    end;
    /

最新更新