检查 sql 中给定列表中的值是否存在于 table - SQL 中

Check if value from given list in sql is existing in table - SQL

我在检查列表中 prestashop 中的某些产品是否存在于我们的商店中时遇到了一些问题。对于一个产品很容易,我们可以在后台检查,但是当我们想检查例如 100 种产品的列表时,这是有问题的。

我有这样的查询

SELECT ps_product_lang.name, 
ps_product.reference, 
ps_product.active AS `Czy aktywny` 
from ps_product  
INNER join ps_product_lang ON ps_product.id_product = ps_product_lang.id_product 
WHERE ps_product.reference NOT IN 
("test1","test2","test3")

但这会显示不在该列表中的所有记录。如何检查列表中的产品是否不在 table 和 return 中,例如“未列出”或类似的东西?

查询结果是这样的 query results 但我只想检查我在列表中出现的哪些元素不在数据库中,就像我在列表中写“wrongtestcode”会导致在查询结果中只显示“wrongtestcode”

恐怕您的图片​​并没有真正帮助,但我认为您需要了解 LEFT OUTER JOINS 和 NULL 值。我认为这些代码示例将有助于解释。

首先这是我的演示数据

declare @list1 table (id int, itemname varchar(30));
insert into @list1 (id, itemname) values
(1, 'item 1'),(2,'item 2'), (3, 'item 3'),
(4, 'item 4'),(5,'item 5'), (6, 'item 6');

declare @list2 table (id int, itemname varchar(30));
insert into @list2 (id, itemname) values
(1, 'item 1'),(4,'item 4'), (6, 'item 6');

如您所见,清单 2 仅包含清单 1 中的 3 项。 要列出两个列表中的项目,请按照您已经完成的操作使用和 INNER JOIN

select l1.id, l2.itemname
from @list1 l1
INNER JOIN @list2 l2 on l1.id = l2.id;

但是要列出 list1 中不在 list2 中的项目,您需要使用 OUTER JOIN 并检查来自 List 2 的 NULL 值

select l1.id, l1.itemname
from @list1 l1
LEFT OUTER JOIN @list2 l2 on l1.id = l2.id
WHERE l2.id IS NULL;

LEFT 外部联接列出联接左侧的每条记录(FROM 子句中列出的第一个 table)。如果连接右侧有匹配行(列表中的下一个 table,即列表 2),那么我们可以从匹配行中获取值,但如果没有匹配项,则 SQL returns NULL 作为值。我们在上面的 WHERE 子句中使用了它,但我们可以用其他方式使用它。

例如列出所有项目并指示是否在列表 2 中 - 这将列出每个项目,每个项目旁边将显示列表 2 中的名称或“不在列表 2 中”的字样

select l1.id, l1.itemname, ISNULL(l2.itemname, 'Not in list 2')
from @list1 l1
LEFT OUTER JOIN @list2 l2 on l1.id = l2.id;

或者,为了更整洁的输出,这将仅在缺少的项目和匹配项目的空白旁边显示“不在列表 2 中”

select l1.id, l1.itemname, 
CASE WHEN l2.itemname IS NULL THEN 'Not in list 2' ELSE '' END as [Flag]
from @list1 l1
LEFT OUTER JOIN @list2 l2 on l1.id = l2.id;