在我開始之前,如上所述,這是一個糟糕的設計。然而,這是我會怎麼查詢它:
CREATE TABLE #Lists (id int, list varchar(500));
INSERT INTO #Lists (id, list) VALUES
(10, NULL), (NULL, '10,20'), (20, '10,20');
WITH cte AS (
SELECT LEFT(list, INSTR(list, '%,%')-1) AS value, SUBSTRING(list, INSTR(list, '%,%') + 1, 500) AS list FROM #Lists
UNION ALL
SELECT CASE WHEN list LIKE ('%,%') THEN LEFT(list, INSTR(list, '%,%')-1) ELSE list END AS value, CASE WHEN list LIKE ('%,%') THEN SUBSTRING(list, INSTR(list, '%,%') + 1, 500) END AS list FROM cte
WHERE CHAR_LENGTH(list) > 0
)
SELECT value, COUNT(*) FROM cte GROUP BY value;
DROP TABLE #Lists;
該解決方案允許任何號碼list
字符串值(如'10,20,30' )。
理想情況下,列表值應存儲在一個單獨的表中,以便每個記錄具有單個值,例如CREATE TABLE BetterDesign (id int, value int) INSERT INTO BetterDesign (id, value) VALUES (10, NULL), (NULL, 10), (NULL, 20), (20, 10), (20, 20)
。伴隨着一百多個其他原因,這對查詢SELECT value, COUNT(*) FROM BetterDesign GROUP BY value
更好。這就是說,我瞭解遺留系統的痛苦。
不知道你想問什麼。 ID 10有空白,但空白有0個計數?空白ID也有點奇怪。它們是列表中值的上限嗎?這裏的設計很可怕 – Twelfth
對於兩列來說,這看起來像是非常糟糕的表格設計...爲什麼您要將值作爲包含列表值的表中的單獨列來查找?爲什麼在數據庫中存儲逗號分隔值?想想如果你在列表中有100個,並且你正在尋找'10',會發生什麼。這需要一個過於複雜的解決方案來解決設計時需要考慮的事情。 – Siyual
Mysql或postgres? – Rams