我不能用 '.' 替換字串的每 2 個字符。
select STUFF('abcdefghi', 3, 1, '.') c3,STUFF('abcdefghi', 5, 1, '.') c5,STUFF('abcdefghi', 7, 1, '.') c7,STUFF ('abcdefghi', 9, 1, '.') c9
如果我使用 STUFF,我應該隨后將字串 c3、c5、c7 和 c9 重疊。但我找不到方法
你能幫助我嗎?
初始字串:
abcdefghi
我想要的結果是
ab.de.gh.
字串最多可包含 50 個字符
uj5u.com熱心網友回復:
創建一個 numbers/tally/digits 表,如果您還沒有,那么您可以使用它來定位每個字符位置:
with digits as ( /* This would be a real table, here it's just to test */
select n from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))x(n)
), t as (
select 'abcdefghi' as s
)
select String_Agg( case when d.n%3 = 0 then '.' else Substring(t.s, d.n, 1) end, '')
from t
cross apply digits d
where d.n <Len(t.s)
使用for xml與現有的表
with digits as (
select n from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))x(n)
),
r as (
select t.id, case when d.n%3=0 then '.' else Substring(t.s, d.n, 1) end ch
from t
cross apply digits d
where d.n <Len(t.s)
)
select result=(select '' ch
from r r2
where r2.id=r.id
for xml path('')
)
from r
group by r.id
uj5u.com熱心網友回復:
你可以這樣試試:
最簡單的可能是這里的古怪更新:
DECLARE @string VARCHAR(100)='abcdefghijklmnopqrstuvwxyz';
SELECT @string = STUFF(@string,3*A.pos,1,'.')
FROM (SELECT TOP(LEN(@string)/3) ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
FROM master..spt_values) A(pos);
SELECT @string;
Better/Cleaner/Prettier 是一個遞回 CTE:
我們使用宣告的表來擁有一些表格樣本資料
DECLARE @tbl TABLE(ID INT IDENTITY, SomeString VARCHAR(200));
INSERT INTO @tbl VALUES('')
,('a')
,('ab')
,('abc')
,('abcd')
,('abcde')
,('abcdefghijklmnopqrstuvwxyz');
--查詢
WITH recCTE AS
(
SELECT ID
,SomeString
,(LEN(SomeString) 1)/3 AS CountDots
,1 AS OccuranceOfDot
,SUBSTRING(SomeString,4,LEN(SomeString)) AS RestString
,CAST(LEFT(SomeString,2) AS VARCHAR(MAX)) AS Growing
FROM @tbl
UNION ALL
SELECT t.ID
,r.SomeString
,r.CountDots
,r.OccuranceOfDot 2
,SUBSTRING(RestString,4,LEN(RestString))
,CONCAT(Growing,'.',LEFT(r.RestString,2))
FROM @tbl t
INNER JOIN recCTE r ON t.ID=r.ID
WHERE r.OccuranceOfDot/2<r.CountDots-1
)
SELECT TOP 1 WITH TIES ID,Growing
FROM recCTE
ORDER BY ROW_NUMBER() OVER(PARTITION BY ID ORDER BY OccuranceOfDot DESC);
- 結果
1
2 a
3 ab
4 ab
5 ab
6 ab.de
7 ab.de.gh.jk.mn.pq.st.vw.yz
簡而言之的想法
- 我們使用遞回 CTE 沿著字串走
- 我們將所需的部分與一個點一起添加
- 我們停止,當剩余的長度是短的繼續
- 一個小魔法是
ORDER BY ROW_NUMBER() OVER()在一起TOP 1 WITH TIES。這將允許出現所有第一行(每個 ID 的第一行)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/361957.html
