【问题标题】:SQL: Use one Table as Input for a 'Like' Statement on Another TableSQL:使用一个表作为另一个表上“Like”语句的输入
【发布时间】:2015-09-17 23:47:58
【问题描述】:

我有一个具有唯一 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 不为空),那么我们应该为新表使用该 CompetitionName 和 ID,并且在第三列(竞赛)下应将竞赛条目从下方放置。对于 equals 规则,标题必须与 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

9 月自行车比赛不包含在此新表格中,因为它不符合任何规则。

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

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

但是,我想从表格中自动获取这些规则,而不是将它们输入出来,并且在规则适用时还从第二个表格中获取相应的竞赛条目,因此我们为这些条目使用标准竞赛名称。我将如何解决这个问题?如果您对解决其中的一部分有任何想法,也请告诉我,因为这是可以构建的。

【问题讨论】:

  • rules 是数据库中的表吗?
  • 还没有,但可以很容易地添加它

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


【解决方案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)

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      相关资源
      最近更新 更多