将两个部分匹配的表连接到完全匹配
Posted
技术标签:
【中文标题】将两个部分匹配的表连接到完全匹配【英文标题】:Join two tables with a partial match to an exact match 【发布时间】:2019-03-01 07:14:33 【问题描述】:我知道的令人困惑的标题。我正在尝试加入两个表:
表格:项目
+---------------+
| ItemName |
+---------------+
| "Banana" |
| "~A Apple" |
| "~B Orange" |
| "Banana ~C" |
| "Apple ~CC" |
+---------------+
表:CODELOOKUP
+-------+------------+
| Code | CodeResult |
+-------+------------+
| "~A" | "One" |
| "~B" | "Two" |
| "~C" | "Three" |
| "~CC" | "Four" |
+-------+------------+
我希望加入这些表格,显示ITEM
表格中的所有项目,如果ItemName
包含"~"
后跟位于ItemName
任何位置的字母组合(但永远不会遇到另一个词 - 它总是在开头,结尾或中间有空格的多个单词的中间)我希望它与CodeResult
值相关。所以ItemName
中的PARTIAL MATCH 与CodeResult
中的EXACT MATCH。
我设法得到以下代码:
SELECT ITEM.*, CODELOOKUP.CodeResult
FROM ITEM LEFT JOIN CODELOOKUP ON INSTR(ITEM.ItemName, CODELOOKUP.Code)
这几乎返回了我所追求的,唯一的问题是它返回了 "Apple ~CC"
行两次:
+-------------+---------+
| "Banana" | "" |
| "~A Apple" | "One" |
| "~B Orange" | "Two" |
| "Banana ~C" | "Three" |
| "Apple ~CC" | "Three" |
| "Apple ~CC" | "Four" |
+-------------+---------+
...它应该只返回与"Four"
完全匹配的行,例如:
+-------------+---------+
| "Banana" | "" |
| "~A Apple" | "One" |
| "~B Orange" | "Two" |
| "Banana ~C" | "Three" |
| "Apple ~CC" | "Four" |
+-------------+---------+
有什么方法可以让它工作?
谢谢
【问题讨论】:
【参考方案1】:您只能在部分匹配项上加入空格,并在字符串末尾附加一个空格,以避免~C
匹配~CC
:
SELECT ITEM.*, CODELOOKUP.CodeResult
FROM ITEM LEFT JOIN CODELOOKUP ON INSTR(ITEM.ItemName & " ",CODELOOKUP.Code & " ")
【讨论】:
以上是关于将两个部分匹配的表连接到完全匹配的主要内容,如果未能解决你的问题,请参考以下文章
如何将带有前缀列的表连接到 PHP MySQL 或 Laravel 中的另外两个表
如果存在匹配值,则从另一个表中检索数据 - 否则基于第一个连接条件返回