如何选择UUID格式+区分大小写通配符的字符串

Dav*_*vid 1 sql t-sql sql-server

如何仅选择 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 格式的字符串,其中 X 是任何数字或任何大写(非小写)字符?

示例数据集:

ed54cb09-b402-4551-912d-b8e0fec69d9e --I do not want to select this one
00029B19-80CC-4FF8-BE11-BDB55FC7FC2A --I do want to select this one
Run Code Online (Sandbox Code Playgroud)

有些是全部大写,有些不是,这是一个 varchar 字段。我只想选择这些全大写的 UUID,不包括其余的。

目前我正在使用 _ 通配符来查找基本 UUID 格式,但看起来 UPPER 不适用于 _ 通配符。前任。:

SELECT mycolumn
FROM mytable t
WHERE  t.mycolumn like UPPER('________-____-____-____-____________') COLLATE SQL_Latin1_General_Cp1_CS_AS
Run Code Online (Sandbox Code Playgroud)

Dal*_*e K 5

如前所述,您可以首先upper使用区分大小写的排序规则将您的值与其自身进行比较,以检查其全部大写。然后使用您的通配符模式(或更精确的模式,如下所示)来确认格式是否正确。

select
    -- Precise check on allowed characters
    case when upper(X.Test) = X.Test collate Latin1_General_CS_AI
        and X.Test like '[A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]-[A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]-[A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]-[A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]-[A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]' then 1 else 0 end
    -- Loose check on allowed character, but definitely upper case
    , case when upper(X.Test) = X.Test collate Latin1_General_CS_AI
        and X.Test like '________-____-____-____-____________' then 1 else 0 end     
    -- Not sure why HABO deleted their answer, but the following works also
    , case when upper(X.Test) = X.Test collate Latin1_General_CS_AI
        and try_convert(uniqueidentifier,X.Test) is not null then 1 else 0 end
    -- And combining Shmiel's and Charleface's suggestions gives
    , case when X.Test like replicate('[A-F0-9]', 8) + '-' + replicate('[A-F0-9]', 4) + '-' + replicate('[A-F0-9]', 4) + '-' + replicate('[A-F0-9]', 4) + '-' + replicate('[A-F0-9]', 12) collate Latin1_General_100_BIN2 then 1 else 0 end

from (
    values ('ed54cb09-b402-4551-912d-b8e0fec69d9e'), ('00029B19-80CC-4FF8-BE11-BDB55FC7FC2A')
) X (Test);
Run Code Online (Sandbox Code Playgroud)

我必须在这里回应 Larnu 的评论,这似乎是一个相当奇怪的要求,可以通过其他地方的系统更改来更好地解决。

  • 二进制排序规则*总是*比任何其他排序规则执行得更好:它不执行任何排序规则,它纯粹是字节比较,因此它是 x86 处理器上非常快的“REPZ CMPSB”。为什么 `Latin1_General_CS_AI` 不起作用我不知道,它似乎对我有用?不相信“REPLICATE”,这可能会很慢地在每一行上计算它(尽管它是确定性的,所以也许编译器足够聪明,可以将其提升出来)并且它实际上并没有更短 (2认同)