创建基于CASE / IIF条件的新列连接查询

时间:2019-06-13 19:04:17

标签: sql-server tsql

我在一个表中有四列。该表列出了每箱的包装数量。四列是- ID PerCase 内箱 每包

我要查询并创建2列ID并压缩 冷凝的色谱柱应为“ perCase / InnerCarton / PerPack” 有许多ID,其中InnerCarton为null,所以我希望压缩列显示“ PerCase / PerPack”

我尝试过-

SELECT ID,
CAST(IIf([Items_UOM].[InnerCase] Is Not Null
        ,[Items_UOM].[PerCase] & '/' & [Items_UOM].[InnerCase] & '/' & [Items_UOM].[PerPack]
        ,[Items_UOM].[PerCase] & '/' & [Items_UOM].[PerPack]) AS varchar(25))
FROM Items_UOM;

我收到一条错误消息-将varchar值'/'转换为数据类型smallint时转换失败。

2 个答案:

答案 0 :(得分:0)

&是二进制和运算符,不是字符串串联运算符。

如果设置了CONCAT_NULL_YIELDS_NULL,则可以使用+将值与斜杠连接起来,并使用concat()来构建整个字符串。与+一样,如果一个操作数为null,则串联得到NULL,对于NULL来说,斜杠被消除了。 concat()会用空字符串替换NULL,因此如果有NULL个值,则总结果不会是NULL

如果值是整数,则需要在+中使用它们之前将它们转换为字符串,否则+被解释为算术加号,并导致引擎尝试将其转换为整数。 '/'到一个数字,当然会失败。

SELECT id,
       concat(convert(varchar(max), items_uom.innercase) + '/',
              convert(varchar(max), items_uom.percase) + '/',
              convert(varchar(max), items_uom.perpack)
       FROM items_uom;

答案 1 :(得分:0)

这里发生的几件事不太正确。首先,要组合字符串,请使用+而不是&。其次,您存在数据类型转换问题,因为您的列是tinyint,并且如果不进行显式转换就不能添加要添加的字符。您还可以通过使用ISNULL或COALESCE而不是IIF并被迫重复逻辑来简化此过程。

这应该对您有用。

SELECT ID,
    convert(varchar(25), [Items_UOM].[PerCase]) + ISNULL('/' + [Items_UOM].[InnerCase], '') + '/' + convert(varchar(25),  [Items_UOM].[PerPack])
FROM Items_UOM;