我的表看起来像这样(所有列都是nvarchar):
| col1 | col2 | col3 |
----------------------
| ... | FFF8 | ... |
| ... | -1 | ... |
| ... | FFF6 | ... |
| ... | -9 | ... |
如果第二列中的值不是" -1"或" -9"我想从十六进制转换为二进制i。有什么建议吗?
答案 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
使用0
,1
使用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