我正在嘗試拆分和連接一個字串。
示例:資料值 1:“12abc,34efg,56hij”
資料值2:“12abc”

預期結果:
Numbers Column 1: "12,34,56"
Numbers Column 2: "12"
Alphabets Column 1: "abc,efg,hij"
Alphabets Column 2 "abc"
做了幾次嘗試:
1.
SELECT [String], value, CONCAT(SUBSTRING(value,1,2), ',') AS Numbers, CONCAT(SUBSTRING(value,3,3), ',') AS Alphabets, LEFT(String,LEN(String)-CHARINDEX(',',String))
FROM [Test].[dbo].[TEST]
CROSS APPLY string_split([String],',') value
WHERE String = String

2.
SELECT [String], LEFT(String,LEN(String)-CHARINDEX(',',String)), LEFT(String,2) AS Numbers, RIGHT(STRING,3) AS Alphabets
FROM [Test].[dbo].[TEST]
WHERE String = String

我已關注 [如何在 SQL Server 中的特定字符之后拆分字串并將此值更新到特定列],因為我認為它非常相似,但我沒有收到我想要的結果,所以我不知道如何繼續或我出錯。
我不確定如何將不同的列連接成 1 列。
附加資訊:我目前正在使用 SQL Server Management Studio v18.9.2。
*抱歉,如果我的解釋很糟糕。
uj5u.com熱心網友回復:
首先,讓我們進入正題;你的設計有缺陷。永遠不要在資料庫中存盤分隔的資料,它違反了規范化的基本規則。我強烈建議您在這里實際做的是修復您的設計并規范化您的資料。
接下來,假設:
- 您正在使用 SQL Server 2017
- 列
string可以只包含字母數字字符(AZ,0-9) - 您正在使用不區分大小寫的排序規則或所有字符都是小寫的
如果是這種情況,那么您可以使用TRANSLATEandREPLACE洗掉字符。您需要先創建一些變數(或使用行內計數)來創建替換字串。
所以,首先,我們得到我們需要的 2 個變數,一個包含字母 az,另一個包含數字 0-9。我使用一個計數來實作這一點:
DECLARE @Alphas varchar(26),
@Numerics varchar(10);
WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT TOP (26)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1, N N2, N N3)
SELECT @Alphas = STRING_AGG(CHAR(96 T.I),''),
@Numerics = STRING_AGG(CASE WHEN T.I <= 10 THEN CHAR(47 T.I) END,'')
FROM Tally T;
現在我們可以將這些值用于TRANSLATE所有這些字符到不同的字符(我將使用管道(|))和REPLACE那些沒有任何內容的管道字符:
SELECT YT.String,
REPLACE(TRANSLATE(YT.String, @Alphas,REPLICATE('|',LEN(@Alphas))),'|','') AS Numerics,
REPLACE(TRANSLATE(YT.String, @Numerics,REPLICATE('|',LEN(@Numerics))),'|','') AS Alphas
FROM dbo.YourTable YT;
或者,當然,您可以直接輸入。;)
SELECT YT.String,
REPLACE(TRANSLATE(YT.String, 'abcdefghijklmnopqrstuvwxyz',REPLICATE('|',LEN('abcdefghijklmnopqrstuvwxyz'))),'|','') AS Numerics,
REPLACE(TRANSLATE(YT.String, '0123456789',REPLICATE('|',LEN('0123456789'))),'|','') AS Numerics
FROM dbo.YourTable YT;
uj5u.com熱心網友回復:
您可以CROSS APPLY到STRING_SPLIT使用STRING_AGG (由于SQL服務器2017年)堅持數字和字母重新走到一起。
select Numbers, Alphabets from TEST cross apply ( select string_agg(left(value, patindex('%[0-9][^0-9]%', value)), ',') as Numbers , string_agg(right(value, len(value)-patindex('%[0-9][^0-9]%', value)), ',') as Alphabets from string_split(String, ',') s ) ca; GO數字 | 字母表 :------- | :---------- 12,34,56 | abc,efg,hij 12 | 美國廣播公司
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/408471.html
標籤:
上一篇:一次保存所有更改-MSSQL
