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)
如前所述,您可以首先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 的评论,这似乎是一个相当奇怪的要求,可以通过其他地方的系统更改来更好地解决。