如果在SQL中columnA = X,则转换columnB值

时间:2017-10-04 09:46:08

标签: sql sql-server-2008 hex type-conversion sql-convert

概述

我有一个内连接语句,将5个表连接在一起,如果我自己这么说的话,它会非常有用。

现在返回的值之一是Hex,它位于名为 Value 的列中,但 Value 列还包含其他值,所以我不能简单地转换整栏。

列值中的每个十六进制值在名为 DataTypeID 的列中都有 18 的标识符。

问题

如果DataTypeID = 18,如何在列值中转换十六进制条目。

我知道这需要一个函数:

SELECT CONVERT(INT, CONVERT(VARBINARY

但我不确定如何写它以及放置它的位置,是在我的内部连接声明之前还是之后?

SELECT Data.Value AS Value, Entry_Data.DataTypeID AS DataTypeID
From Database.Entry
INNER JOIN Database.Data on Entry_Data.DataTypeID=DataTypeID
INNER Join Database.Data on Data.Value=Value

请注意,这不是脚本的准确示例,仅用于示例目的

现在我假设我会在此查询之上创建我的函数,然后在其下面添加 where 函数。

列和标识符的名称是准确的。

1 个答案:

答案 0 :(得分:0)

您可以使用case表达式。

您的查询有点难以解释意图,因此我假设您有两个表(TableA和TableB),并且您希望将这两个表连接到另一个:TableA.Value = TableB.Value,但是TableB将其Value列存储为int和hex(int)的混合,其中hex(insts)由TableB.VDataTypeID = 18的值标识,而任何其他DataTypeID表示TableB.Value是常规int。

如果是这种情况,请执行以下操作:

SELECT
    ...
FROM 
    TableA 
    INNER JOIN TableB ON TableA.Value 
        = CASE WHEN TableB.DataTypeID = 18 THEN Convert(...
            ELSE TableB.DataTypeID
        END

因此,您有效地将CASE表达式用作要加入的就地函数。

它读取,如果TableB.DataTypeID不是18,则直接将TableA连接到TableB,如果它是18,则先转换TableB.Value然后再进行连接。

希望这能满足您的需求: - )