我有一個在表中包含多行的 sqlite 資料庫。其中一列包含任意數量的正整數的字串,因此:
1: '### ## # # # ## # ##'
2: '# ## # ## # ##'
3: '# # # ## ## ### #'
...
我還在我的 python 代碼中得到了一個比較字串,它也看起來像 '## # ### #' 比較字串還包含任意數量的正整數。
現在,如果我們將資料庫字串作為 'abcdef' 而我們的比較字串作為 'ghijk',我需要測驗我的比較字串中是否有任何 3 個連續的數字(所以 'ghi' 或 'hij' 或 'ij k' ) 也是資料庫中的連續數字。所以基本上我需要測驗資料庫中的每一行,如果
'g h i' == 'a b c' or 'g h i' == 'b c d' or ...
我的資料當前保存在資料庫中的方式是否可行,或者我是否需要以任何其他方式保存我的資料。無論哪種方式,我怎樣才能用 SQL 做到這一點?
uj5u.com熱心網友回復:
我會為你的桌子提出一個不同的設計。
而不是像這樣存盤數字:
| 格魯普 | 價值 |
|---|---|
| 1 | '10 100 20 5 70' |
| 2 | '100 20 5 35 3 15' |
您可以對表格進行標準化,以便每行僅包含 1 個值:
| ID | 格魯普 | 價值 |
|---|---|---|
| 1 | 1 | 10 |
| 2 | 1 | 100 |
| 3 | 1 | 20 |
| 4 | 1 | 5 |
| 5 | 1 | 70 |
| 6 | 2 | 100 |
| 7 | 2 | 20 |
| 8 | 2 | 5 |
| 9 | 2 | 35 |
| 10 | 2 | 3 |
| 11 | 2 | 15 |
這樣可以更容易地連接連續數字(在三元組或其他任何東西中),以便您可以檢查連接的數字是否包含在您的字串中。
創建表:
CREATE TABLE tablename(id INTEGER PRIMARY KEY AUTOINCREMENT, grp INTEGER, value INTEGER);
并且對于每一行,使用視窗函式LEAD()來獲取下一個數字和之后的數字,以便您創建一個連接的三元組。
然后您可以使用運算子LIKE檢查字串中是否存在三元組:
WITH cte AS (
SELECT *,
value || ' ' ||
LEAD(value, 1) OVER (PARTITION BY grp ORDER BY id) || ' ' ||
LEAD(value, 2) OVER (PARTITION BY grp ORDER BY id) str
FROM tablename
)
SELECT grp, MAX(' ' || ? || ' ' LIKE '% ' || str || ' %') flag
FROM cte
GROUP BY grp;
或者,更好的可擴展解決方案:
WITH cte AS (
SELECT *,
CASE WHEN ROW_NUMBER() OVER (PARTITION BY grp ORDER BY id) > 2
THEN GROUP_CONCAT(value, ' ') OVER (
PARTITION BY grp ORDER BY id
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
)
END str
FROM tablename
)
SELECT grp, MAX(' ' || '6 100 20 5 12 19' || ' ' LIKE '% ' || str || ' %') flag
FROM cte
GROUP BY grp;
替換?為您的字串。
查看一個簡化的演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/375472.html
