0

概述

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

现在返回的值之一是十六进制,它位于名为Value的列中,但是,Value列还包含其他值,因此我不能简单地转换整个列。

Value 列中的每个 Hex 条目在名为DataTypeID的列中都有一个标识符18

问题

如果 DataTypeID = 18,我如何转换列 Value 中的十六进制条目。

我知道这需要一个功能:

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函数。

列名和标识符是准确的。

4

1 回答 1

0

您可以使用case表达式。

您的查询有点难以解释意图,因此我将假设您有两个表(TableA 和 TableB),并且您希望像这样将一个表连接到另一个表:TableA.Value = TableB.Value但是 TableB 将其 Value 列存储为ints 和 hex(ints) 的混合,其中 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,然后再进行连接。

希望这能给你你所需要的:-)

于 2017-10-04T09:50:30.180 回答