将带有十六进制字符串的nvarchar转换为二进制

时间:2017-09-19 12:16:34

标签: sql sql-server sql-server-2012

我的表看起来像这样(所有列都是nvarchar):

| col1 | col2 | col3 |
----------------------
|  ... | FFF8 | ...  |
|  ... |  -1  | ...  |
|  ... | FFF6 | ...  |
|  ... |  -9  | ...  |

如果第二列中的值不是" -1"或" -9"我想从十六进制转换为二进制i。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

可能有一种更简单的方法,但你可以使用18次替换。 。

select (case when col2 <> ('-1', '-9')
             then replace(replace(. . . (replace(col2, '0', 'oooo'), '1', 'oool'), . . . ,
                                  'o', '0'), 'l', '1')
             else col2
         end)

换句话说,将每个十六进制数字替换为二进制数的等效数字。这对o使用01使用l。这可以防止一个替换影响另一个。

答案 1 :(得分:1)

感谢link

它仍然使用替换,但它看起来比以前的答案好一点:

CREATE FUNCTION [dbo].[HexToBinary] 
(
@hex varchar(200) 
)

RETURNS varchar(1000)

AS

BEGIN

SET @HEX=REPLACE (@HEX,'0','0000')
set @hex=replace (@hex,'1','0001')
set @hex=replace (@hex,'2','0010')
set @hex=replace (@hex,'3','0011')
set @hex=replace (@hex,'4','0100')
set @hex=replace (@hex,'5','0101')
set @hex=replace (@hex,'6','0110')
set @hex=replace (@hex,'7','0111')
set @hex=replace (@hex,'8','1000')
set @hex=replace (@hex,'9','1001')
set @hex=replace (@hex,'A','1010')
set @hex=replace (@hex,'B','1011')
set @hex=replace (@hex,'C','1100')
set @hex=replace (@hex,'D','1101')
set @hex=replace (@hex,'E','1110')
set @hex=replace (@hex,'F','1111')

RETURN @hex
END

GO
 select 
CASE when col2 IN ('-1', '-9') THEN col2
    ELSE [dbo].[HexToBinary] (col2)
END as val
from
(
    SELECT 'FFF8' as col2
    UNION ALL
    SELECT '-1' as col2
    UNION ALL
    SELECT 'FFF6' as col2
    UNION ALL
    SELECT '-9' as col2
) a