我在构建特定查询以选择记录时遇到问题。这是我正在努力实现的一个愚蠢的例子。
假设我有一个名为Criteria
的表,看起来像这样:
ID Unit Product Part
== ======== ======= ========
1 'sports' 'bike' 'handle'
2 'sports' ' ' ' '
3 'furn' 'couch' ' '
etc.
我有一个名为Entries
的表,看起来像这样:
ID Tuple
== =========================
1 'sports / bike / seat'
2 'sports / racket / frame'
3 'furn / desk / leg'
4 'furn / lamp / shade'
etc.
Criteria
中的记录1表明任何“运动/自行车/手柄”元组都有资格。 Criteria
中的记录2,其中Product
和Part
包含空格,表示任何以'sports'开头的元组都符合条件(“sports /%/%”)。记录3表明任何以'furn'和'couch'开头的元组都符合条件(“furn / couch /%”)。我想选择不符合任何条件的所有记录。
在这种情况下,应返回Entries
中的记录3和4,因为它们与任何给定标准都不匹配。
我是SQL新手,因此我无法提出合适的查询。我的思考过程是这样的:
对于Criteria
的每条记录,根据Unit
,Product
和Part
构建字符串比较字符串。例如,对于记录1,字符串将是'sports / bike / handle'。对于记录2,字符串将是'sports /%/%',并且记录3:'furn / couch /%'。现在,选择Tuple
不等于任何字符串的所有记录。我无法将其转换为SQL术语,这就是我需要你帮助的地方。
答案 0 :(得分:2)
您可以使用外部联接执行此操作,使用类似:
select e.*
from Entries e left outer join
(select c.*,
((case when c.unit = ' ' then '%' else c.unit end) + ' / ' +
(case when c.product = ' ' then '%' else c.product end) + ' / ' +
(case when c.part = ' ' then '%' else c.part end)
) as likestr
from Criteria c
) c
on e.tuple like likestr
where c.id is null
这将是一项昂贵的操作,但应该做你想做的事。
如果将元组的组件存储在单独的列中,则数据结构会更有意义。然后你可以进行逐列比较。
答案 1 :(得分:2)
为什么要存储这样的数据?询问心灵想知道。
但是,您可以尝试以下几点:
select *
from entries e
where not exists ( select *
from criteria c
where e.tuple like case coalesce( unit , '' ) when '' then '%' else unit end
+ ' / ' + case coalesce( product , '' ) when '' then '%' else product end
+ ' / ' + case coalesce( part , '' ) when '' then '%' else part end
)
丑陋,但是gits完成了。