缩短SQL查询以检查条目是否具有特定值或不存在

时间:2019-06-21 14:43:17

标签: sql oracle hql

我有一个标签表,其中每一行都有“名称”和“值”列。名称是唯一的。

我有一组(固定)名称(尽管随着时间的流逝我可能需要添加到名称中-可以在发生这种情况时编辑查询)

我需要检查集合中的每个名称,是否都没有该名称的行,或者如果存在一行,则对应的值是两个不同的固定字符串之一(例如“ ONE”和“ TWO”)

我对查询的长度也有限制-它本身存储在数据库表中,并且必须<2048个字符长。

对于每个标签,我目前都使用类似下面的查询的方法,该方法可以正常工作,但是当我的集合中有更多不同的名称时,它很快就会超过最大长度。

是否有其他(更短的)方法?查询以获取存在的标签名称的子集,然后检查所有标签名称是否具有两个值之一?

想法(我在SQL中不知道如何做):计算在固定列表中具有名称的标签的数量。计算在我的固定列表中具有名称的标签数量和两个允许值之一,比较计数

获取固定列表中所有不同的标记值。检查不同的值是我的允许值列表的子集

DB是Oracle,但是我想要一个也可以与MariaDB一起使用的解决方案。我可以使用HQL或SQL。

and (
    NOT exists(
      from
        tags T
      where
        T.name = 'FOOBAR'
    )
    OR exists(
      from
        tags T
      where
        T.name = 'FOOBAR'
        and T.value in('ONE', 'TWO')
    )
  )

2 个答案:

答案 0 :(得分:2)

这应该实现相同的目标:

and (
    NOT exists(
      from
        tags T
      where
        T.name = 'FOOBAR'
      and
        T.value not in ('ONE','TWO')
)

即。除非您的集合中有T.name = 'FOOBAR',否则它将过滤value处的记录。

不确定是否会节省足够的空间。

答案 1 :(得分:0)

尝试

where nvl((select max(t.value) from tags t where name ='FOOBAR'), 'ONE') in ('ONE', 'TWO')