Sql присоединяется к полю, но сначала разделяет значение по разделителю и использует только часть

У меня есть несколько SKU для проданных / выставленных счетов-фактур в таблице базы данных, но некоторые из SKU имеют дополнительные данные, добавленные в конце SKU, разделенные каналом (может быть много каналов после базового SKU). то есть я мог бы иметь такой же продукт SKU, как это

correct-product-sku
correct-product-sku|assembled
correct-product-sku|assembled|custom
etc...

Я хочу объединить таблицу продуктов с таблицей счетов-фактур.

SELECT COUNT(*) AS totalCount, productVariant.productKey
FROM invoiceItem
INNER JOIN productVariant ON invoiceItem.sku = productVariant.sku

Но это только присоединится к базовому SKU correct-product-sku и проигнорирует остальные.

Есть ли эффективный способ разделить invoiceItem.sku по | а затем использовать только первую часть [0] . Очевидно, что у SKU не всегда будет | в нем или может быть добавлен один или несколько.

Любые указатели будут оценены.

Всего 3 ответа


Вы можете использовать функции CHARINDEX и LEFT, как показано ниже, чтобы присоединиться к

Код редактируется с учетом того, что столбец Sku содержит только реальное значение без каких-либо | в этом.

SELECT COUNT(*) AS totalCount, productVariant.productKey
FROM invoiceItem
INNER JOIN productVariant 
ON LEFT(
    invoiceItem.sku,
        CASE 
            WHEN CHARINDEX('|',invoiceItem.sku,0) = 0 THEN  LEN(invoiceItem.sku)
            ELSE CHARINDEX('|',invoiceItem.sku,0) -1
        END
) = productVariant.sku

Я собирался предложить функцию подстроки, но в этой ситуации левый более ясен:

substring(invoiceItem.sku, 1, charindex('|', invoiceItem.sku)-1)

Если sku имеет фиксированную длину, вы можете использовать длину вместо функции charindex.


Вы можете использовать как:

SELECT COUNT(*) AS totalCount, pv.productKey
FROM invoiceItem it INNER JOIN
     productVariant pv
     ON pv.sku LIKE i.sku + '|%'
GROUP BY pv.productKey;

Есть идеи?

10000