SQL:使用一个表作为另一个表上“Like”语句的输入

时间:2015-09-17 23:47:58

标签: sql sql-server-2008 sql-like

我有一个具有唯一ID和竞争名称的SQL数据库,因此:

ID     CompetitionName
1      August Running Race
2      Running Race August
3      Running Race August
4      Running Race August.
5      Cycling Race
6      Cycling Race September

请注意,即使CompetitionName相同,每一行都会获得自己的ID。

然后我有一个文件,使用规则将这些竞争名称合并到合理的组中。规则可以是“等于”或“包含”。包含规则意味着如果上表中的CompetitionName以任何顺序包含“RuleA”下的内容以及“RuleB”下的内容(如果RuleB不为空白),那么我们应该将该竞争名称和ID用于我们的新表和在第三栏(比赛)下,应从下面列出比赛条目。对于等于规则,标题必须与RuleA完全匹配。

RuleType   RuleA           RuleB     Competition
Contains   Running Race    August    August Running Race
Equals     Cycling Race              September Cycling Race

所以我想要的输出是:

ID     CompetitionName      Competition
1      August Running Race  August Running Race
2      Running Race August  August Running Race
3      Running Race August  August Running Race
4      Running Race August. August Running Race
5      Cycling Race         September Cycling Race

Cycling Race September不包含在此新表中,因为它与任何规则都不匹配。

在我目前的代码中,我使用like语句一次执行一条规则:

select ID
from table1
where 
(CompetitionName LIKE '%Running Race%' and CompetitionName LIKE '%August%')

但是,我想从表中自动采用这些规则而不是输入它们,并且当规则适用时也从第二个表中获取相应的竞赛条目,因此我们有这些条目的标准竞争名称。我该如何解决这个问题?如果您有任何解决方案的想法,请告诉我,因为它是建立在上面的东西。

2 个答案:

答案 0 :(得分:1)

我不确定第一部分,但是第二部分似乎是一个存储过程,使用临时表/表变量来存储标准竞争名称。然后你可以从中选择。

答案 1 :(得分:1)

假设数据库中有rules表,您可以

select t.ID, t.CompetitionName, r.competition
from table1 t, rules  
where CompetitionName like 
(case when ruletype = 'Contains' then '%' + RuleA + RuleB + '%' end)
or CompetitionName in (case when ruletype = 'Equals' then RuleA end)

然而,这不是理想的方法,你应该专注于纠正表格设计。