【问题标题】:sql query for alphanumeric ID in hexsql查询十六进制的字母数字ID
【发布时间】:2012-03-23 13:40:27
【问题描述】:

我希望能够区分字母数字字符串和十六进制格式的字符串。

我目前的查询是:

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

我发现了这种在线搜索十六进制 ID 的方法,我认为它有效。但是,在获得更大的样本量后,我可以在结果中看到很高的误报率。问题是这给了我我想要的所有结果,但它也给了我一堆我不关心的结果。例如:

我想看看:

<url>.php?mains=d7ad916d1c0396ff

但我不想看到:

<url>.php?mblID=2007012422060265

这两个字符串之间的区别在于我要收集的末尾的 16 个字符都是数字而不是十六进制 ID。你们使用哪些方法将结果限制为仅十六进制 ID?提前致谢。

更新: Juergen 提出了一个很好的观点,第二个数字可以是一个十六进制值。并非所有十六进制数字都包含 [a-F]。我想重新表述这个问题,说明我正在寻找一个包含字母和数字的 ID,而不仅仅是数字。

【问题讨论】:

  • 但第二个数字可能是一个十六进制值。并非所有十六进制数字都包含 [a-F]
  • @juergend 这是一个很好的观点。我将重新表述这个问题,说明我正在寻找一个包含字母和数字的 ID,而不仅仅是数字。
  • 如果没有存储任何关于它是什么基数的额外信息,您不可能确定一个字符串是代表十六进制还是十进制。如果你有一个包含12345678 的字符串,比如说,你怎么知道它是十进制还是十六进制?

标签: sql sql-server hex alphanumeric


【解决方案1】:

最简单的方法就是为该限制添加一个单独的子句:

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

【讨论】:

  • 太棒了!我什至没有想过要这样做。谢谢!当 stackoverflow 允许时,我会在 5-8 分钟内将此标记为我的答案。
  • 如果您需要避免所有可能的陷阱,请使用 REPLICATE('[0-9ABCDEFabcdef]',16) 并将 COLLATE 子句应用于指定区分重音排序规则的 LIKE 表达式。
【解决方案2】:

判断一个字符串是否只包含数字应该相当简单...

设置测试表:

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”或“~”嵌入到字符串中?

【讨论】:

  • ISNUMERIC 不会这样做,因为它接受一些包含字母 E 的字符串。例如,isnumeric('1234567890123E12') 的计算结果为 1。
猜你喜欢
  • 1970-01-01
  • 2014-03-11
  • 2015-05-06
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
  • 2015-08-08
  • 2018-05-17
  • 1970-01-01
相关资源
最近更新 更多