2012-03-23 255 views
0

字母數字ID的SQL查詢我希望能夠一個字符串,它是字母數字的和一個字符串,它是十六進制格式之間進行區分。爲十六進制

我當前的查詢是:

<columnName> LIKE '?_____=' + REPLICATE('[0-9A-Fa-f]',16) 

我發現尋找六角ID在線的這個方法,我認爲這是工作。然而,在獲得更大的樣本量後,我的結果中可以看到很高的誤報率。問題是,這給我所有我想要的結果,但它也給了我一堆我不關心的結果。例如:

我想看看:

<url>.php?mains=d7ad916d1c0396ff 

,但我不希望看到的:

<url>.php?mblID=2007012422060265 

2個字符串之間的區別是,在最後的16個字符,我想收集都是數字,而不是一個十六進制ID。你們用什麼方法將結果限制爲十六進制ID?感謝advnace。

UPDATE: 克林斯曼提出了一個很好的點,第二個數字可能是一個十六進制值。並非所有的十六進制數字都包含[a-F]。我想重申一下這個問題,說明我正在尋找一個包含字母和數字的ID,而不僅僅是數字。

+4

但第二個數字可能是一個十六進制值。並非所有的十六進制數字都包含[a-F] – 2012-03-23 13:42:42

+0

@juergend這是一個很好的觀點。我將重新說明這個問題,說明我正在尋找一個包含字母和數字的ID,而不僅僅是數字。 – toosweetnitemare 2012-03-23 13:44:01

+0

你不可能確定一個字符串是否代表十六進制或十進制,而沒有任何額外的信息被存儲在關於它的基礎上。如果你有一個包含'12345678'的字符串,比如說,你怎麼知道它是十進制還是十六進制? – 2012-03-23 13:44:26

回答

3

最簡單的方法就是添加一個單獨的條款爲限制:

<columnName> LIKE '?_____=' + REPLICATE('[0-9A-Fa-f]',16) 
AND <columnName> NOT LIKE '?_____=' + REPLICATE('[0-9]',16) 
+0

太棒了!我甚至沒有想過這樣做。謝謝!當我使用stackoverflow時,我會在5-8分鐘內將其標記爲我的答案。 – toosweetnitemare 2012-03-23 13:49:55

+0

如果您需要避免所有可能的錯誤,請使用REPLICATE('[0-9ABCDEFabcdef]',16)並將COLLATE子句應用於LIKE表達式,該表達式指定了區分重音的整理。 – 2012-03-24 06:27:19

1

它應該是相當簡單的,以確定是否字符串只包含數字...

建立一個測試表:

CREATE TABLE #Temp (Data char(32) not null) 

INSERT #Temp 
    values ('<url>.php?mains=d7ad916d1c0396ff') 
     ,('<url>.php?mblID=2007012422060265 ') 

編寫一個查詢:

SELECT 
    right(Data, 16)    StringToCheck 
    ,isnumeric(right(Data, 16)) IsNumeric 
from #Temp 

獲取結果:

StringToCheck IsNumeric 
d7ad916d1c0396ff 0 
2007012422060265 1 

所以,如果IsNumeric函數返回0,它可能是一個十六進制字符串。

此做了幾個假設:

  • 最右邊的16個字符是要檢查
  • 你永遠只能打16個字符的內容。我不知道字符串何時會檢查太久。
  • 非數字字符表示十六進制。 「Q」或「〜」嵌入字符串的機會是什麼?
+1

ISNUMERIC不會這麼做,因爲它接受一些包含字母E的字符串。例如,isnumeric('1234567890123E12')的計算結果爲1。 – 2012-03-24 06:24:00