我有以下SQL查询
SELECT
productVariants.productKey
FROM
[merchProductVariant] productVariants
LEFT JOIN
[merchInvoiceItem] invoices ON productVariants.sku = invoices.sku
WHERE
invoices.sku IS NULL
GROUP BY
productVariants.productKey
但是,在我在invoices.sku上加入productVariants.sku之前,我需要从invoices.sku中删除一些文字
在invoices.sku专栏中有一个例子。一些SKU附加了几个自定义字符串。这些是
|installed and |assembled
所以在merchProductVariant
中,我会有像这样的SKU
123456
在发票中,我将拥有相同的SKU但是喜欢这个
123456
123456|installed
123456|assembled
我需要能够剥离那些管道串,以便我可以匹配它们。或者查询将它们作为单独的SKU。
答案 0 :(得分:2)
您可以在SUBSTRING
之前使用invoices.sku
,然后加入以下代码。
在执行'|'
之前最后添加SUBSTRING
来处理没有'|'的场景字符存在于invoices.sku
列中。
SELECT
productVariants.productKey
FROM
[merchProductVariant] productVariants
LEFT JOIN
[merchInvoiceItem] invoices ON productVariants.sku = SUBSTRING(invoices.sku +'|',0, CHARINDEX('|', invoices.sku + '|'))
WHERE
invoices.sku IS NULL
GROUP BY
productVariants.productKey
也可以通过以下方式使用LIKE完成。
ON invoices.sku + '|' LIKE productVariants.sku + '|%'
注意:
这是假设它总是采用格式 sku | some_text。 @ leen3o - 您甚至可能想要添加一些明确的内容 如果sku始终是一个数字,那么就可以在那里进行表达。 - MK _
答案 1 :(得分:2)
出于性能原因,我建议您添加" real" sku到发票表。然后,您可以将其编入索引并简化查询:
alter table merchInvoiceItem
add sku_real as (left(sku, charindex('|', sku + '|')) persisted;
create index idx_merchInvoiceItem_sku_real on merchInvoiceItem(sku_real);
然后您可以将查询编写为:
SELECT pv.productKey
FROM merchProductVariant mpv LEFT JOIN
merchInvoiceItem i
ON mpv.sku = i.sku_real
WHERE i.sku IS NULL
GROUP BY pv.productKey;
在表格中使用正确的sku
应该有助于在桌面上写下许多查询。
答案 2 :(得分:1)
一种方法是使用replace
函数
productVariants.sku = replace(replace(invoices.sku, '|installed', ''), '|assembled', '')