3
4

4 回答 4

4
;WITH rw AS
(
    SELECT '0000AF0012B' ishexornot
    UNION ALL
    SELECT '0000AF0012G'
    UNION ALL
    SELECT '0000AF0012 '
)
SELECT *, CASE WHEN ishexornot LIKE '%[^0-9A-F]%' THEN 0 ELSE 1 END
FROM rw

所以

WHERE [GUID] LIKE '%[^0-9A-F]%'

于 2016-06-21T09:37:51.440 回答
3

Just use LIKE with a wildcard character for a specific range:

SELECT * FROM [GUIDs] WHERE [GUID] LIKE '%[g-z]%';
于 2016-06-21T08:33:20.633 回答
2

从 SQL Server 2012 开始,您可以使用TRY_CONVERT()

declare @t table (
    Id int identity (1,1) primary key,
    Value varchar(100) not null
);

insert into @t (Value)
values
('F6AA1EE0-DF55-43E8-92ED-B2A84E621485'),
('F32E4621CE004C47889DEBDA9BA790AF'),
('09F94C95-9004-4C7C-8F5D-9CA374546288'),
('5DAFD4C7-C780-4F32-9BF1-52027371546A'),
('4D81BD419BFE42EA956E715023EF3B77');

select t.*
from @t t
where try_convert(uniqueidentifier, t.Value, 2) is null;

与 with 不同CONVERT(),示例中的查询没有错误,并返回第 2 行和第 5 行。

于 2016-06-21T11:16:13.780 回答
0

在 postgres 中,您可以使用POSIX 正则表达式

select "GUID" ~ '[0-9A-F]{32}' as is_hex from the_table;

上面检查字符串的长度是否也是 32

于 2020-06-22T10:53:00.163 回答