TSQL 問題:
我在顯示的列中有一個字串值,如下所示:
行 ID、名稱、列 1 1,鮑勃,|性別 - 男| 2,薩莉,|性別 - 女| |年齡 - 30| 3,約翰,|性別 - 男| 4,托馬斯,|性別 - 男| 5,劉易斯,|性別 - 男| |年齡 - 20|
如果只有一組||,我只想從Column1中提取值,所以例如在另一列column2中,我已經完成了
Replace(substring(column1,charindex('-',column1) 2,charindex('|',column1) ),'|','') AS column2
如果只有一組|,這給了我值,但是我如何忽略2組管道,就好像有2組管道一樣,然后它會提取第一組,也不提取第二組管道。如果有 2 組管道,我希望能夠忽略并將值保留在列中,并且只更新具有 1 組管道的那些。
所以上面的示例資料集應該如下所示:
行 ID、名稱、列 1 1,鮑勃,男 2,薩莉,|性別 - 女| |年齡 - 30| 3、約翰,男 4、托馬斯,男 5,劉易斯,|性別 - 男| |年齡 - 20|
我在想也許可以以某種方式掃描第 1 列的字串值,如果有超過 1 個 -(dash) 符號然后忽略?
或者,還有更好的方法?
uj5u.com熱心網友回復:
正如其他人所提到的,您的架構設計應該重新設計為規范化的結構。至于您的 column2 示例,不確定您在那里嘗試做什么,因為它正在尋找“=”符號。
帶有 CASE WHEN 的 SQL 子字串
這是一個回傳預期輸出的腳本:
DROP TABLE IF EXISTS #Temp
CREATE TABLE #Temp
(
RowID INT
,[Name] Varchar(100)
,Column1 VARCHAR(1000)
)
INSERT INTO #Temp
VALUES
(1,'Bob','|Gender - Male|')
,(2,'Sally','|Gender - Female| |Age - 30|')
,(3,'John','|Gender - Male|')
,(4,'Thomas','|Gender - Male|')
,(5,'Lewis','|Gender - Male| |Age - 20|')
SELECT *
,ParsedColumn = CASE
/*Only parse if exactly 2 pipes in data*/
WHEN NumOfPipes = 2 THEN SUBSTRING(Column1,B.IdxFirstHyphen 2,C.IdxFirstPipeAfterFirstDash-B.IdxFirstHyphen - 2)
/*Else return raw data from column1*/
ELSE Column1
END
FROM #Temp
CROSS APPLY (
SELECT NumOfPipes = LEN(Column1) - LEN(REPLACE(Column1,'|',''))
,IdxFirstHyphen = CHARINDEX('-',Column1) /*Location of first hyphen*/
) AS B
CROSS APPLY (SELECT IdxFirstPipeAfterFirstDash = CHARINDEX('|',Column1,B.IdxFirstHyphen)) AS C /*Location of first pipe after the first hyphen*/
uj5u.com熱心網友回復:
這應該非常有效,首先拆分字串-并提取帶有|后綴的值。然后聚合并僅回傳 column1 僅分為兩行的提取值:
select rowId, name, Iif(Count(*)=2,Max(Extracted),column1) Column1
from t
outer apply (
select case when Right(value,1)='|' then Trim(Replace(value,'|','')) end Extracted
from String_Split(column1, '-')
)x
group by rowId, name, column1;
演示小提琴
uj5u.com熱心網友回復:
這是非常低效的,但有效。
create function dbo.stringCounter (@Column nvarchar(255), @Character nchar(1))
returns int
AS
BEGIN
Declare @count int
select @Count=len(@Column) - len(replace(@Column,@Character,''))
Return @count
END
GO
select dbo.stringCounter(column1,'|'),column1 from TableName where dbo.stringCounter(column1,'|')=2
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/436448.html
下一篇:將附件發布到jirac#
