如何根据 mysql 中的通配符匹配执行条件连接?

How can I perform a conditional join based on wildcard match in mysql?

我有两个 table 值,第一个包含(除其他外)产品型号,第二个包含有关保修的信息。我没有所有产品的详尽清单(部分原因是我不知道会发布新产品,但我需要报告的保修准确),所以第二个 table 包含通配符匹配的值,例如诸如“1080”、'HD'、“4K”等。我所知道的是具有特定型号的产品具有与之相关的特定保修,即 1080 或高清产品具有 3 年保修,而4K(和其他)是5(例如)。

我目前的非可扩展解决方案是使用 CASE 语句,但这需要为每个已知模型通配符匹配的 case 语句单独一行;这意味着 ETL 将变得过时,而且可能会很快过时 - 这是有问题的。

CREATE TABLE sales AS
MODEL varchar(255), sold_date as DATETIME;

INSERT INTO sales (model, sold_date)
VALUES ('PANASONIC_HD_ANDROID', '2020-01-01');

INSERT INTO sales (model, sold_date)
VALUES ('PANASONIC_1080_ANDROID', '2020-01-01');

INSERT INTO sales (model, sold_date)
VALUES ('SONY_HD_ROKU', '2020-01-01');


INSERT INTO sales (model, sold_date)
VALUES ('SONY_1080_ROKU', '2020-01-01');


INSERT INTO sales (model, sold_date)
VALUES ('SONY_4K_ROKU', '2020-01-01');

CREATE TABLE warranties AS
model_wildcard VARCHAR(255),
warranty_length INT;

INSERT INTO warranties (model_wildcard, warranty_length) VALUES ('HD', 3);
INSERT INTO warranties (model_wildcard, warranty_length) VALUES ('4K', 5);
INSERT INTO warranties (model_wildcard, warranty_length) VALUES ('1080', 3);

我想要完成的是这样的事情

SELECT sales.model, sales.sold_date, DATE_ADD(sales.sold_date, INTERVAL S.warranty_length)
FROM sales as S
LEFT JOIN warranties W on S.model LIKE W.model_wildcard

这显然行不通,但我认为这说明了我正在尝试做的事情。

SELECT *,
       ss.sold_date + INTERVAL ww.warranty_length YEAR warranty_till
FROM sales ss
LEFT JOIN warranties ww ON LOCATE(ww.model_wildcard, ss.model);

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=5b8777058c71635e1b082fddf8eb902b

您必须了解模型名称可能不匹配任何模式(使用LEFT JOIN,相应列将返回NULL)。或者,向后,它可能匹配多个模式(将返回所有匹配项)。

PS。 ON INSTR(ss.model, ww.model_wildcard)也可以用