0

我在构建特定查询以选择记录时遇到问题。这是我想要达到的目标的一个愚蠢的例子。

假设我有一个名为的表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.

记录 1Criteria表明任何“运动/自行车/手柄”的元组都符合条件。中的记录 2 Criteria,其中ProductPart包含空格,表明任何以“sports”开头的元组都符合条件(“sports / % / %”)。记录 3 表明任何以 'furn' 和 'couch' 开头的元组都符合条件(“furn / couch / %”)。我想选择符合任何条件的所有记录。

在这种情况下,应该返回记录 3 和 4 Entries,因为它们不匹配任何给定的条件。

我是 SQL 新手,所以我无法提出合适的查询。我的思考过程是这样的:

对于 的每条记录,基于、和Criteria构建一个字符串比较字符串。例如,对于记录 1,字符串将是“运动/自行车/手柄”。 对于记录 2,字符串将是'sports / % / %',对于记录 3:'furn / couch / %'。现在,选择不等于任何这些字符串的所有记录。我在将其翻译成 SQL 术语时遇到了麻烦,这就是我需要您帮助的地方。UnitProductPartTuple

4

2 回答 2

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
                 )

丑陋,但完成了。

于 2012-08-30T01:30:12.200 回答
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

这将是一项昂贵的操作,但应该做你想做的。

如果您将元组的组件存储在单独的列中,则数据结构会更有意义。然后,您可以进行逐列比较。

于 2012-08-30T01:22:42.777 回答