我有一个标签表,其中每一行都有“名称”和“值”列。名称是唯一的。
我有一组(固定)名称(尽管随着时间的流逝我可能需要添加到名称中-可以在发生这种情况时编辑查询)
我需要检查集合中的每个名称,是否都没有该名称的行,或者如果存在一行,则对应的值是两个不同的固定字符串之一(例如“ 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')
)
)
答案 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')