2016-06-21 35 views
2

TL; DR如何在選擇行時測試字符串是否爲十六進制?如何檢查VARCHAR字符串是不是十六進制?


如果我有GUID的其中有些是Base36,而不是如果十六進制的表:

ID | GUID 
    ===|================================= 
    1 | CAFEBABECAFED00DB16B00B515BADA55 
    2 |ABCDEFGHIJKLMNOPQRSTUV 
    3 | DEADBEAF4D15EA5EDEFEC8EDFEE1DEAD 

我想與那些不完全十六進制GUID的所有行。

對於一個單身人士,我可以嘗試CONVERT(VARBINARY(32),[GUID],2),看看它是否失敗,但我不能在查詢中。如果我可以查詢WHERE isNaN(parseInt(GUID,16)),它將是自動安全的(同時必須應用於所有行)。

當然我可以爲以下F(WHERE [GUID] LIKE '%g%' OR [GUID] LIKE '%h%' OR …),但這種不得已樣的辦法信件全文搜索導致我問這個問題:

如何查詢(非)十六進制只有字段?

回答

2

只需使用LIKE用通配符特定範圍:

SELECT * FROM [GUIDs] WHERE [GUID] LIKE '%[g-z]%'; 
2
;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]%'

+0

是使用一個CTE對實際想法有重要意義? – dakab

+0

@dakab CTE在這裏填充一些數據。 –

0

如果你還在乎大小寫,然後整理可能是需要的。
由於LIKE的默認行爲大多不區分大小寫。

select Id, [Guid], 
(CASE WHEN [Guid] collate sql_latin1_general_cp1_cs_as NOT LIKE '%[^0-9A-F]%' THEN 1 ELSE 0 END) as isHex 
from (
select 1 as Id, 'CAFEBABECAFED00DB16B00B515BADA55' as [Guid] union all 
select 2, 'ABCDEFGHIJKLMNOPQRSTUV' union all 
select 3, 'DEADBEAF4D15EA5EDEFEC8EDFEE1DEAD' union all 
select 4, 'cafeBABECAFED00DB16B00B515badA55' 
) q; 
1

從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; 

不像CONVERT(),樣品中的查詢工作沒有錯誤,並返回行2和5

+0

它是SQL Server 2008 R2。但是,讓我們假設這個問題是版本不可知的。你如何使用'try_convert',它有什麼幫助? – dakab

+0

謝謝,現在它更全面。這種內置功能顯然是爲了這個目的而設計的。我只希望有一天我可以使用它。 – dakab

相關問題