获取两个连续大写字符的索引

Pat*_*Pat 1 sql sql-server collation string-parsing

我试图将一个city/state/zip字段分为城市、州和邮政编码。通常我会用charindexof','来获取城市和州,用isnumericandright()来获取邮政编码。

这对于 zip 来说效果很好,但是我现在处理的数据中的大多数行都没有逗号City ST Zip。有没有办法识别两个大写字符的索引?

如果没有,除了单独检查每个州的案例陈述之外,是否有人有更好的主意?

编辑:我发现 PATINDEX/COLLATE 选项的工作相当间歇性。请参阅下面我的回答。

Sol*_*zky 5

PATINDEX似乎间歇性工作的原因是,A-Z即使使用区分大小写的排序规则,也无法使用字符范围(即 )来完成区分大小写的搜索。问题是字符范围的工作方式类似于排序,并且区分大小写的排序将大写字母与其等效的小写字母分组,就像在字典中排序一样。范围排序实际上是:a、A、b、B、c、C、d、D 等。或者,根据排序规则,它可能是:A、a、B、b、C、c、D、d 等(有 31 种排序规则首先对大写字母进行排序)。在区分大小写的排序规则中执行此操作时,仅将所有A条目分组在一起,与条目分开a,而在区分大小写的排序,它们将混合在一起。

但是,如果您单独指定每个字母(因此不使用范围),那么它将按预期工作:

PATINDEX(N'%[ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]%',
     [CityStZip] COLLATE Latin1_General_100_CS_AS)
Run Code Online (Sandbox Code Playgroud)

PATINDEXLIKE(两者都允许单个字符类)以这种方式工作的原因[A-Z][start-end]语法不是正则表达式。许多人声称PATINDEXLIKE支持“有限”正则表达式,因为支持这种语法,但事实并非如此。它只是与正则表达式非常相似(并且令人困惑的相似)语法,[A-Z]通常不会包含任何小写匹配。

当然,如果您保证只搜索 AZ 的美式英语字母,则使用二进制排序规则(即以 结尾的排序规则_BIN2;不要使用以 结尾的排序规则,_BIN因为自 SQL Server 2005 推出以来它们已被弃用,我相信)应该有效。

PATINDEX(N'%[A-Z][A-Z]%', [CityStZip] COLLATE Latin1_General_100_BIN2)
Run Code Online (Sandbox Code Playgroud)

有关区分大小写匹配的更多详细信息,特别是关于包含 Unicode / NVARCHAR 数据的详细信息,请参阅我在 DBA.StackExchange 上的相关答案:

如何查找具有多个连续大写字符的值