Sql 如何拆分像';ABCxxz';转换为大写形式';ABC&x27;小写';xxz';?

Sql 如何拆分像';ABCxxz';转换为大写形式';ABC&x27;小写';xxz';?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我的数据如下所示: ABCAbbz XXZxxz ZAAAZa Xaaaab 我需要将它们分为两列: ABCA bbz XXZ xxz AAAZ a X aaaab 我尝试了一些类似“%[a-z]”的COLLATE-Latin1\u-General\u-BIN方法,但我不知道如何拆分 (AAxAx永远不会发生。)您可以使用PATINDEX()函数执行此操作,并强制其区分大小写: SELECT SUBSTRING( t.MyColumn

我的数据如下所示:

ABCAbbz 
XXZxxz
ZAAAZa
Xaaaab
我需要将它们分为两列:

ABCA   bbz 
XXZ    xxz
AAAZ   a
X      aaaab
我尝试了一些类似“%[a-z]”的
COLLATE-Latin1\u-General\u-BIN方法
,但我不知道如何拆分


AAxAx
永远不会发生。)

您可以使用
PATINDEX()
函数执行此操作,并强制其区分大小写:

SELECT
    SUBSTRING(
        t.MyColumn
        ,0
        ,PATINDEX('%[a-z]%', t.MyColumn COLLATE Latin1_General_BIN))
    AS uppercase
    ,SUBSTRING(
        t.MyColumn
        ,PATINDEX('%[a-z]%', t.MyColumn COLLATE Latin1_General_BIN)
        ,LEN(t.MyColumn))
    AS lowercase
FROM MyTable t

您可以使用
PATINDEX()
函数执行此操作,并强制其区分大小写:

SELECT
    SUBSTRING(
        t.MyColumn
        ,0
        ,PATINDEX('%[a-z]%', t.MyColumn COLLATE Latin1_General_BIN))
    AS uppercase
    ,SUBSTRING(
        t.MyColumn
        ,PATINDEX('%[a-z]%', t.MyColumn COLLATE Latin1_General_BIN)
        ,LEN(t.MyColumn))
    AS lowercase
FROM MyTable t
试试这个:

试试这个:


使用自定义.Net程序集@VJHil看起来像SQL Server。您使用的是什么数据库?这两部分的长度总是一样的吗?我使用的是MS-SQL2008。另一个样本数据可以是
ZAAZZdb
ZAAZZ
db
。总是一种情况下,另一种情况下?或者有时是
BaIzGz
BIG azz
@arserbin3我想op是在说,该列不可能具有自定义.Net程序集的那种类型的数据@VJHil看起来像SQL Server。您使用的是什么数据库?这两部分的长度总是一样的吗?我使用的是MS-SQL2008。另一个样本数据可以是
ZAAZZdb
ZAAZZ
db
。总是一种情况下,另一种情况下?或者有时是
BaIzGz
BIG azz
@arserbin3我想op是说,该专栏不可能有它工作过的那种类型的数据。请您解释一下整个[abcdefghijklmnopqrstuvwxyz],因为我尝试了[a-z],但没有,它不起作用。@user1032613在任何支持
PATINDEX
[a-z]
的MS Sql Server版本上都可以正常工作。例如,请参见我答案中的Sql FIDLE链接。如果在
PATINDEX
中它对您不起作用,则可能是输入错误。@user1032613:如果您使用的是“Latin1\u General\u BIN”,它应该会起作用。但在我的例子中,我使用的是“Latin1\u General\u CS\u AS”。希望这能清除它。尝试改变同样的,你可以看到预期的输出工作。请您解释一下整个[abcdefghijklmnopqrstuvwxyz],因为我尝试了[a-z],但没有,它不起作用。@user1032613在任何支持
PATINDEX
[a-z]
的MS Sql Server版本上都可以正常工作。例如,请参见我答案中的Sql FIDLE链接。如果在
PATINDEX
中它对您不起作用,则可能是输入错误。@user1032613:如果您使用的是“Latin1\u General\u BIN”,它应该会起作用。但在我的例子中,我使用的是“Latin1\u General\u CS\u AS”。希望这会清除它。尝试更改相同的,您可以看到预期的输出
with t as (
select 'ZXXabc' as ColumnToScrub
union
select 'Abdsfsdf'
union
select 'YYYSKHFDSbc')

select 
distinct
    ColumnToScrub,
    left(
        ColumnToScrub,
        max(
            case 
                when ASCII( substring( ColumnToScrub , P.number , 1 ) ) between 65 and 90 then P.number 
                else 0 
            end
        ) over (partition by ColumnToScrub)  
    ) as UpperString,
    right(
        ColumnToScrub,
        len(columnToScrub) - 
        max( 
            case 
                when ASCII( substring( ColumnToScrub , P.number , 1 ) ) between 65 and 90 then P.number 
                else 0 
            end
        ) over (partition by ColumnToScrub) 
    ) as LowString
from t
left join master..spt_values P
            on P.number between 1 and len(t.ColumnToScrub)
            and type ='P'