2016-06-21 10 views
2

TL; DR行を選択するときに文字列が16進数であるかどうかをテストするにはどうすればよいですか?VARCHAR文字列が16進数ではないことを確認する方法は?


私は16進ならば、それらのいくつかではなくBase36あるのGUIDを持つテーブルがあった場合:

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

、そしてCOLLATEおそらく必要です。
LIKEのデフォルトの動作は、大文字と小文字を区別しないためです。

SQL Server 2012のから始まっ
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

、あなたがTRY_CONVERT()採用することができます。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; 

を、サンプル中のクエリがエラーなしで動作し、2と5

+0

これはSQL Server 2008 R2です。しかし、その問題はバージョンに依存しないと仮定しましょう。どのように 'try_convert'を使用しますか?どのように役立ちますか? – dakab

+0

ありがとう、今はるかに包括的です。この組み込み関数は、この目的のために明らかに考えられました。私はいつかそれを使用できることを願っています。 – dakab

関連する問題