我有兩個值表,第一個包含(除其他外)產品型號,而第二個包含有關保修的資訊。我沒有所有產品的詳盡串列(部分原因是我不知道會發布新產品,但我需要報告的保修是準確的),所以第二個表包含通配符的值匹配,例如“1080”、“HD”、“4K”等。我所知道的是,具有特定型號的產品具有與之相關的特定保修,即 1080,或 HD 產品具有 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
這顯然行不通,但我認為這可以理解我正在嘗試做的事情。
uj5u.com熱心網友回復:
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)也可以使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/476778.html
上一篇:如何計算具有給定成員的組的行數?
