用于从数据表和模式表生成匹配的 SQL

发布于 2024-10-21 04:42:22 字数 410 浏览 6 评论 0原文

给定一个包含 id、color、size 列的数据表和一个包含规则/模式(例如rule_id、color_condition 和 size_condition)的第二个表。

因此,基本规则是rule_id=1,Color=blue, size=Any 或rule_id=2,Color=blue, size=15

如何构造一个SQL 查询来生成第三个表中的匹配项

例如对于数据表 id=1、color=blue、size=10 这两个规则都适用,因此匹配表将包含两个条目

rule_id=1, entry_id=1
rule_id=2, entry_id=1

如何循环模式以及如何构造匹配,以便它可以处理通配符或忽略条件(如果它们)是空的。

请提供方向或关键词,我准备阅读。

Given a data table with columns id, color, size and a second table with rules/patterns so rule_id, color_condition and size_condition.

So a basic rule would be rule_id=1,Color=blue, size=Any or rule_id=2,Color=blue, size=15

How can I construct a SQL query that produces matches into a third table

For example for an entry in the data table id=1, color=blue, size=10 both rules would apply and therefor the matches table would cotain two entries

rule_id=1, entry_id=1
rule_id=2, entry_id=1

How To cycle through the patterns and how to construct the matching so that it can deal with wildcards or omit conditions if they are empty.

Please provide directions or keywords, I am ready to read.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

七堇年 2024-10-28 04:42:22

假设您有规则表:

Rule
Id--Color--Size
1 --blue -- null
2 --blue -- 15

和条目表

Entry
Id--Color--Size
1 --blue -- 10

放置空值而不是“任何”值以保持强类型

解决方案:

Select r.id as rule_id,
       e.id as entry_id
From Entry e inner join Rule r
          On (e.Color = r.Color or r.Color is null)
          And (e.Size <= r.Size or r.Size is null)

您可以创建一个新表颜色以获得更好的性能:

Color
Id--Name
1 --Red
2 --Blue

Rule
Id--Id_Color--Size
1 --  2     -- null
2 --  2     -- 15

Entry
Id--Id_Color--Size
1 --   2    -- 10

Select r.id as rule_id,
       e.id as entry_id
From Entry e inner join Rule r
     On  (e.Id_Color = r.Id_Color or r.Color is null)
     And (e.Size <= r.Size or r.Size is null)

为两个 Id_Colors 添加索引

Let's say you have the rule table :

Rule
Id--Color--Size
1 --blue -- null
2 --blue -- 15

And Entry table

Entry
Id--Color--Size
1 --blue -- 10

Put a null value instead of a 'Any' value to keep some strong typing

A solution :

Select r.id as rule_id,
       e.id as entry_id
From Entry e inner join Rule r
          On (e.Color = r.Color or r.Color is null)
          And (e.Size <= r.Size or r.Size is null)

You can create a new table Color for better performance :

Color
Id--Name
1 --Red
2 --Blue

Rule
Id--Id_Color--Size
1 --  2     -- null
2 --  2     -- 15

Entry
Id--Id_Color--Size
1 --   2    -- 10

Select r.id as rule_id,
       e.id as entry_id
From Entry e inner join Rule r
     On  (e.Id_Color = r.Id_Color or r.Color is null)
     And (e.Size <= r.Size or r.Size is null)

Add an index to both Id_Colors

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文