我會用numbers table來解決這個問題,無論如何它都非常有用,所以如果你沒有,我會考慮創建一個,但爲了完整的答案,我會假設你沒有一個並且不能創建一個。在這種情況下,你可以很容易地使用動態生成號碼列表:
WITH N1 AS (SELECT N FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) n (N)),
N2 (N) AS (SELECT 1 FROM N1 AS N1 CROSS JOIN N1 AS N2),
N3 (N) AS (SELECT 1 FROM N2 AS N1 CROSS JOIN N2 AS N2),
--N4 (N) AS (SELECT 1 FROM N3 AS N1 CROSS JOIN N3 AS N2)
Numbers (Number) AS (SELECT ROW_NUMBER() OVER(ORDER BY N) FROM N3)
SELECT Number
FROM Numbers;
這將啓動與一個table value constructor(N1)創建10行的表,然後它加入與自己這個表獲得100行(N2)的表格,然後將N2連接到自身以獲得10,000行(N3),這可以根據需要重複,最後使用ROW_NUMBER()
在每行中獲得序號。 Aaron Bertrand在generating a set or sequence without loops上完成了一個非常全面的系列,並且這種方法出現在最前面(作爲一種即時創建表格的方法)。
一旦你有了這個號碼錶,您可以在加入到您的模板使用SUBSTRING
找到每個"{"
的位置:
SELECT t.Template,
StartPosition = n.Number
FROM dbo.T
INNER JOIN Numbers n
ON SUBSTRING(t.Template, n.Number, 1) = '{';
你的榜樣,這將返回16,和43。然後你可以使用CHARINDEX
找到下面每個"{"
的"}"
:
SELECT t.Template,
StartPosition = n.Number,
EndPosition = CHARINDEX('}', t.template, n.Number) + 1
FROM dbo.T
INNER JOIN Numbers n
ON SUBSTRING(t.Template, n.Number, 1) = '{';
然後你就可以再次使用SUBSTRING
提取術語之間的每個開始和結束位置。因此,一個完整的示例應該是:
DECLARE @T TABLE (Template NVARCHAR(MAX));
INSERT @T (Template)
VALUES ('<div>
<div>{FirstName}</div>
<div>{LastName}</div>
</div>');
WITH N1 AS (SELECT N FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) n (N)),
N2 (N) AS (SELECT 1 FROM N1 AS N1 CROSS JOIN N1 AS N2),
N3 (N) AS (SELECT 1 FROM N2 AS N1 CROSS JOIN N2 AS N2),
--N4 (N) AS (SELECT 1 FROM N3 AS N1 CROSS JOIN N3 AS N2)
Numbers (Number) AS (SELECT ROW_NUMBER() OVER(ORDER BY N) FROM N3)
SELECT t.Template,
StartPosition = n.Number,
EndPosition = CHARINDEX('}', t.template, n.Number) + 1,
Term = SUBSTRING(t.template, n.Number, CHARINDEX('}', t.template, n.Number) + 1 - n.Number)
FROM @T t
INNER JOIN Numbers n
ON SUBSTRING(t.Template, n.Number, 1) = '{';
您的匹配由{}標識,對嗎? SQL Server或MySQL?你在你的標籤中使用兩個! – Ionic
我的不好,mysql被刪除。 – War
K,我會提供 – Ionic