我有以下字串:
1119/2/483/11021
我想反轉該字串中元素的順序。期望的輸出:
11021/483/2/1119
T-SQL 2014 版
uj5u.com熱心網友回復:
您需要一個有序的拆分功能,例如(靈感):
CREATE FUNCTION dbo.SplitOrdered
(
@list nvarchar(max),
@delim nvarchar(10)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
WITH w(n) AS (SELECT 0 FROM (VALUES (0),(0),(0),(0)) w(n)),
k(n) AS (SELECT 0 FROM w a, w b),
r(n) AS (SELECT 0 FROM k a, k b, k c, k d, k e, k f, k g, k h),
p(n) AS (SELECT TOP (COALESCE(LEN(@list), 0))
ROW_NUMBER() OVER (ORDER BY @@SPID) -1 FROM r),
spots(p) AS
(
SELECT n FROM p
WHERE (SUBSTRING(@list, n, LEN(@delim 'x') - 1) LIKE @delim OR n = 0)
),
parts(p,val) AS
(
SELECT p, SUBSTRING(@list, p LEN(@delim 'x') - 1,
LEAD(p, 1, 2147483647) OVER (ORDER BY p) - p - LEN(@delim))
FROM spots AS s
)
SELECT listpos = ROW_NUMBER() OVER (ORDER BY p),
Item = LTRIM(RTRIM(val))
FROM parts
);
然后您可以使用STRING_AGG()(如果 SQL Server 2017 或更高FOR XML PATH版本)或更低版本重新組裝:
SQL Server 2017
DECLARE @OriginalString nvarchar(255) = N'1119/2/483/11021';
SELECT NewString = STRING_AGG(o.Item, N'/')
WITHIN GROUP (ORDER BY listpos DESC)
FROM dbo.SplitOrdered(@OriginalString, N'/') AS o;
SQL Server < 2017
DECLARE @OriginalString nvarchar(255) = N'1119/2/483/11021';
SELECT NewString = STUFF(
(SELECT N'/' o.Item
FROM dbo.SplitOrdered(@OriginalString, N'/') AS o
ORDER BY o.listpos DESC
FOR XML PATH, TYPE).value(N'.[1]', N'nvarchar(max)'),1,1,N'');
- 示例資料庫<>小提琴
uj5u.com熱心網友回復:
請根據內置的PARSENAME()T-SQL 函式嘗試以下解決方案。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, Tokens VARCHAR(MAX));
INSERT INTO @tbl (Tokens) VALUES
('1119/2/483/11021'),
('1120/25/484/1102');
-- DDL and sample data population, end
SELECT tbl.*
, PARSENAME(c, 1) '/'
PARSENAME(c, 2) '/'
PARSENAME(c, 3) '/'
PARSENAME(c, 4) AS Result
FROM @tbl AS tbl
CROSS APPLY (VALUES (REPLACE(Tokens, '/', '.') )) AS t(c);
輸出
---- ------------------ ------------------
| ID | Tokens | Result |
---- ------------------ ------------------
| 1 | 1119/2/483/11021 | 11021/483/2/1119 |
| 2 | 1120/25/484/1102 | 1102/484/25/1120 |
---- ------------------ ------------------
uj5u.com熱心網友回復:
首先,拆分字串并將其轉換為列,然后按 desc 排序并將多行值顯示為單行。在下面的代碼中,您可以設定任何字串和拆分字符。
嘗試以下方式。
DECLARE @S varchar(max) ,
@Split char(1),
@X xml
DECLARE @Names VARCHAR(8000)
SELECT @S = '1119/2/483/11021',
@Split = '/'
SELECT @X = CONVERT(xml,' <root> <myvalue>'
REPLACE(@S,@Split,'</myvalue> <myvalue>') '</myvalue> </root> ')
select @Names = COALESCE(@Names '/', '') Value from (
select rowno,Value from (
select ROW_NUMBER() OVER(ORDER BY d) AS rowno , Value from (
SELECT T.c.value('.','varchar(20)') as Value,0 as d
FROM @X.nodes('/root/myvalue') T(c)
) m
) r
) t order by t.rowno desc
select @Names as ReverseString
uj5u.com熱心網友回復:
將字串拆分為子字串,然后將它們連接起來,很可能是一個好方法。
一些評論提到使用字串反轉,但在您的情況下,這似乎根本不是一個好方法,因為您只想反轉當前字串中單詞的順序,而不是實際逐個反轉整個文本字串 -特點。
PS:string_split不保證chunk的順序!
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/311515.html
標籤:sql sql-server 查询语句 sql-server-2014
上一篇:Sql表資料顯示變化
