Создать запрос с новой конкатенацией столбцов на основе критериев CASE / IIF - PullRequest
0 голосов
/ 13 июня 2019

У меня есть четыре столбца в таблице.В таблице указаны количества упаковок на коробку.Четыре столбца - ID PerCase InnerCarton PerPack

Я хочу запрос и создать 2 столбца ID и сжатый столбец должен привести к "perCase / InnerCarton / PerPack", есть много идентификаторов, где InnerCarton равен нулю, поэтому я хочусжатый столбец для отображения «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 голосов
/ 13 июня 2019

У вас здесь происходит несколько вещей, которые не совсем корректны.Во-первых, для объединения строк вы используете +, а не &.Во-вторых, у вас есть проблемы с преобразованием типов данных, потому что ваши столбцы имеют тип 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;
0 голосов
/ 13 июня 2019

& - это двоичный файл и оператор, а не оператор объединения строк.

Если установлено CONCAT_NULL_YIELDS_NULL , можно использовать + для объединения значений с косой чертой и concat() для построения общей строки.Как и в случае +, конкатенация получает NULL, если один операнд имеет значение null, слеш в некотором роде исключается в течение NULL s.concat() однако заменяет NULL s пустой строкой, поэтому общий результат не будет 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...