挑戰不利用 REVERSE() 函數來反轉字串,REVERSE() 函數本身沒有任何問題,實務上仍是利用它來反轉字串,在此只是來考驗對 T-SQL 結果集(set based operations)的操作。
不單獨反轉單一字串,反轉 Table 欄位中的全部資料。
- Sample Data
ID data ----------- -------------------- 1 Jacob 2 Sebastian
- Expected Result
id data ----------- -------------------- 2 naitsabeS 1 bocaJ
- 規則
- 不能利用使用者自訂函數,且只能用單一個 T-SQL語法
- 請確實利用用提供的 Smaple Data 來作答,方便檢查結果是否正確
- 沒有 SQL Server 的版本限制
- 個人解法
DECLARE @t TABLE( ID INT IDENTITY, data VARCHAR(20)) INSERT INTO @t(data) SELECT 'Jacob' INSERT INTO @t(data) SELECT 'Sebastian' ; WITH CTE AS ( SELECT ID , Data ,1 AS Location FROM @T UNION ALL SELECT ID , Data , Location + 1 FROM CTE WHERE Location < LEN(Data) ) , CTE2 AS ( SELECT ID , SUBSTRING(Data,Location,1) AS Data , Location FROM CTE ) , CTE3 AS ( SELECT ID , CAST(Data AS VARCHAR(100)) AS Data , Location , 1 AS Counts FROM CTE2 WHERE Location = 1 UNION ALL SELECT T2.ID , CAST( RTRIM(T2.Data) + T3.Data AS VARCHAR(100)) , T2.Location , T3.Counts + 1 FROM CTE2 AS T2 JOIN CTE3 AS T3 ON T2.ID = T3.ID AND T2.Location = T3.Counts + 1 ) SELECT T4.ID , T4.Data FROM CTE3 AS T4 JOIN ( SELECT ID , MAX(Counts) AS Counts FROM CTE3 GROUP BY ID ) AS T5 ON T4.ID = T5.ID AND T4.Counts = T5.Counts ORDER BY T4.ID DESC
- 參考 Solutions Winner 解法後的改良
DECLARE @t TABLE( ID INT IDENTITY, data NVARCHAR(20)) INSERT INTO @t(data) SELECT 'Jacob' INSERT INTO @t(data) SELECT 'Sebastian' ; WITH CTE AS ( SELECT ID , Data , CAST('' AS NVARCHAR(10)) AS String , LEN(Data) AS Pos FROM @t UNION ALL SELECT ID , Data , CAST(RTRIM(String) + SUBSTRING(Data , Pos , 1 ) AS NVARCHAR(10)) , Pos - 1 FROM CTE WHERE Pos > 0 ) SELECT ID , string AS Data FROM CTE WHERE Pos = 0 ORDER BY ID DESC原本解法是把字串拆開成 Data,再去針對 Data 跑 CTE , 了解 Solutions 的邏輯後,發現自己搞得太複雜,邊拆編組合字串就可以完成。
沒有留言:
張貼留言