返回SQL查询,其中字段不包含特定文本

时间:2014-03-12 14:58:06

标签: sql

我将设置一个快速方案然后问我的问题:假设我的仓库有一个DB,其中包含以下字段:StorageBinID,StorageReceivedDT,StorageItem和StorageLocation。

任何单个存储仓都可能有多个记录,因为其中包含多个项目。所以,我想要做的是创建一个只返回不包含某个项目的存储箱的查询,但是,我不想要其余的内容。例如,假设我的仓库中有5000个存储箱,我知道有一些箱子里面没有“ItemX”,列在StorageItem字段中。我想返回StorageBinID的简短列表,而没有获得没有ItemX及其全部内容的所有bin的完整列表。 (我认为排除IN,LIKE和CONTAIN及其NOTS)

我现在的解决方法是运行两个查询,通常在StorageReceivedDT中。第一个是收到日期的垃圾箱,然后第二个是包含ItemX的垃圾箱。然后将.csv文件导入Excel并使用ISNA(MATCH)公式比较两列。

这可以通过查询吗?非常感谢您提出任何建议。

2 个答案:

答案 0 :(得分:0)

您可以使用having子句作为聚合查询执行此操作。只计算" ItemX"的行数。出现在每个箱子中,并选择计数为0的箱子:

select StorageBinID
from table t
group by StorageBinID
having sum(case when StorageItem = "ItemX" then 1 else 0 end) = 0;

请注意,这仅返回包含一些项目的bin。如果您有完全空的箱子,它们将不会出现在结果中。您没有提供足够的信息来处理这种情况(尽管我可以推测您有一个StorageBins表来解决这个问题。)

答案 1 :(得分:0)

你使用什么样的SQL? 根据您提供的信息,您可以使用:

select distinct StorageBinID
from table_name
where StorageBinID not in (
    select StorageBinID
    from table_name
    where StorageItem like '%ItemX%'
)

您必须将table_name替换为表的名称。 如果只想要完全匹配(StorageItem恰好是“ItemX”),则应替换条件

where StorageItem like '%ItemX%'

where StorageItem = 'ItemX'

另一种选择(应该更快):

select StorageBinID
from table_name
minus
select StorageBinID
from table_name
where StorageItem like '%ItemX%'