TSQL 使用 SUBSTRING PATINDEX 和 STUFF 修改数据
TSQL Using SUBSTRING PATINDEX and STUFF to Amend Data
TSQL MSSQL 2008r2
我需要帮助修改数据。
我已经走了这么远,现在我需要帮助。
示例数据
[编辑] 添加了更多示例
DECLARE @Table TABLE (NodePropertyValue NVARCHAR(50))
INSERT INTO @Table (NodePropertyValue)
VALUES
(N'AA11✏AAA ZZZZ'),
(N'CRAP BB22✏BBB'),
(N'CC55✏CC1'),
(N'DD66✏666'),
(N'EE55✏EEE ES177'),
(N'RUBBISH FF22✏FFF XXXXXX'),
(N'NONSENSE')
我想这样显示数据。
如果 NCHAR(9999)
或铅笔存在并且接下来的 3 个字符是字母,则在第三个字符后添加 slash
(/)。如果在添加的 slash
之后存在任何其他字符,则将其删除。所以对于 [AA11✏AAA ZZZZ] 应该更新为 [AA11✏AAA/]。
如果存在NCHAR(9999)
且前4个字符之前有字符则删除。所以对于 [CRAP BB22✏BBB] 应该更新为 [BB22✏BBB/]
对于 [NONSENSE] 应显示为 NULL
.
这是我所知道的。如您所见,我坚持添加 slash
并删除不需要的字符。
SELECT
V.NodePropertyValue 'Orignal'
,CASE --Pencil NCHAR(9999) exists
WHEN PATINDEX('%'+NCHAR(9999)+'%', UPPER(V.NodePropertyValue)) > 0
THEN
CASE
WHEN --FIRST 4 chars match XX11 and 5th char equals NCHAR(9999)
PATINDEX('[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue)) > 0
AND SUBSTRING(V.NodePropertyValue, PATINDEX('%[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4, 1) = NCHAR(9999)
THEN
STUFF(V.NodePropertyValue, PATINDEX('[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4
, 50
, SUBSTRING(V.NodePropertyValue, PATINDEX('[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4, 50) )
WHEN --Any 4 chars match XX11 and preceding char is space and 5th char equals NCHAR(9999)
PATINDEX('% [A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue)) > 0
AND SUBSTRING(V.NodePropertyValue, PATINDEX('%[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4, 1) = NCHAR(9999)
THEN
STUFF(V.NodePropertyValue, PATINDEX('% [A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4
, 50
, SUBSTRING(V.NodePropertyValue, PATINDEX('% [A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4, 50) )
ELSE
NULL
END
ELSE
NULL
END 'Updated'
FROM
@Table V
如果铅笔后面总是有字母而没有数字,这样就够了吗?
select case when patindex('%' + nchar(9999) + '%' , NodePropertyValue)=0 then null
else substring( NodePropertyValue, patindex('%' + nchar(9999) + '%', NodePropertyValue)-4, 8) + '/'
end as StringStart
from @Table
这是一种获得所需结果的方法:
创建并填充示例 table(我根据我们在评论中的对话添加了更多示例数据)
DECLARE @Table TABLE (NodePropertyValue NVARCHAR(50))
INSERT INTO @Table (NodePropertyValue)
VALUES
(N'AA11✏AAA ZZZZ'),
(N'CRAP BB22✏BBB'),
(N'EE55✏EEE ES177'),
(N'RUBBISH FF22✏FFF XXXXXX'),
(N'AA✏AAA ZZZZ'),
(N'AA✏A2A ZZZZ'),
(N'AA✏A'),
(N'NONSENSE')
用于计算所需模式的开始和结束的 cte
;WITH CTE AS
(
SELECT NodePropertyValue,
-- note: there are are 4 underscores before the pencil
PATINDEX('%____'+ NCHAR(9999) +'[a-z][a-z][a-z]%', NodePropertyValue) As startPattern,
CHARINDEX(NCHAR(9999), NodePropertyValue) + 3 As EndPattern
FROM @Table
)
查询cte:
SELECT NodePropertyValue,
CASE WHEN startPattern > 0 THEN
SUBSTRING(NodePropertyValue, startPattern, EndPattern-startPattern+1) + '/'
ELSE
NULL
END As Updated
FROM CTE
结果:
NodePropertyValue Updated
AA11✏AAA ZZZZ AA11✏AAA/
CRAP BB22✏BBB BB22✏BBB/
EE55✏EEE ES177 EE55✏EEE/
RUBBISH FF22✏FFF XXXXXX FF22✏FFF/
AA✏AAA ZZZZ NULL
AA✏A2A ZZZZ NULL
AA✏A NULL
NONSENSE NULL
TSQL MSSQL 2008r2
我需要帮助修改数据。 我已经走了这么远,现在我需要帮助。
示例数据
[编辑] 添加了更多示例
DECLARE @Table TABLE (NodePropertyValue NVARCHAR(50))
INSERT INTO @Table (NodePropertyValue)
VALUES
(N'AA11✏AAA ZZZZ'),
(N'CRAP BB22✏BBB'),
(N'CC55✏CC1'),
(N'DD66✏666'),
(N'EE55✏EEE ES177'),
(N'RUBBISH FF22✏FFF XXXXXX'),
(N'NONSENSE')
我想这样显示数据。
如果 NCHAR(9999)
或铅笔存在并且接下来的 3 个字符是字母,则在第三个字符后添加 slash
(/)。如果在添加的 slash
之后存在任何其他字符,则将其删除。所以对于 [AA11✏AAA ZZZZ] 应该更新为 [AA11✏AAA/]。
如果存在NCHAR(9999)
且前4个字符之前有字符则删除。所以对于 [CRAP BB22✏BBB] 应该更新为 [BB22✏BBB/]
对于 [NONSENSE] 应显示为 NULL
.
这是我所知道的。如您所见,我坚持添加 slash
并删除不需要的字符。
SELECT
V.NodePropertyValue 'Orignal'
,CASE --Pencil NCHAR(9999) exists
WHEN PATINDEX('%'+NCHAR(9999)+'%', UPPER(V.NodePropertyValue)) > 0
THEN
CASE
WHEN --FIRST 4 chars match XX11 and 5th char equals NCHAR(9999)
PATINDEX('[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue)) > 0
AND SUBSTRING(V.NodePropertyValue, PATINDEX('%[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4, 1) = NCHAR(9999)
THEN
STUFF(V.NodePropertyValue, PATINDEX('[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4
, 50
, SUBSTRING(V.NodePropertyValue, PATINDEX('[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4, 50) )
WHEN --Any 4 chars match XX11 and preceding char is space and 5th char equals NCHAR(9999)
PATINDEX('% [A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue)) > 0
AND SUBSTRING(V.NodePropertyValue, PATINDEX('%[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4, 1) = NCHAR(9999)
THEN
STUFF(V.NodePropertyValue, PATINDEX('% [A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4
, 50
, SUBSTRING(V.NodePropertyValue, PATINDEX('% [A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4, 50) )
ELSE
NULL
END
ELSE
NULL
END 'Updated'
FROM
@Table V
如果铅笔后面总是有字母而没有数字,这样就够了吗?
select case when patindex('%' + nchar(9999) + '%' , NodePropertyValue)=0 then null
else substring( NodePropertyValue, patindex('%' + nchar(9999) + '%', NodePropertyValue)-4, 8) + '/'
end as StringStart
from @Table
这是一种获得所需结果的方法:
创建并填充示例 table(我根据我们在评论中的对话添加了更多示例数据)
DECLARE @Table TABLE (NodePropertyValue NVARCHAR(50))
INSERT INTO @Table (NodePropertyValue)
VALUES
(N'AA11✏AAA ZZZZ'),
(N'CRAP BB22✏BBB'),
(N'EE55✏EEE ES177'),
(N'RUBBISH FF22✏FFF XXXXXX'),
(N'AA✏AAA ZZZZ'),
(N'AA✏A2A ZZZZ'),
(N'AA✏A'),
(N'NONSENSE')
用于计算所需模式的开始和结束的 cte
;WITH CTE AS
(
SELECT NodePropertyValue,
-- note: there are are 4 underscores before the pencil
PATINDEX('%____'+ NCHAR(9999) +'[a-z][a-z][a-z]%', NodePropertyValue) As startPattern,
CHARINDEX(NCHAR(9999), NodePropertyValue) + 3 As EndPattern
FROM @Table
)
查询cte:
SELECT NodePropertyValue,
CASE WHEN startPattern > 0 THEN
SUBSTRING(NodePropertyValue, startPattern, EndPattern-startPattern+1) + '/'
ELSE
NULL
END As Updated
FROM CTE
结果:
NodePropertyValue Updated
AA11✏AAA ZZZZ AA11✏AAA/
CRAP BB22✏BBB BB22✏BBB/
EE55✏EEE ES177 EE55✏EEE/
RUBBISH FF22✏FFF XXXXXX FF22✏FFF/
AA✏AAA ZZZZ NULL
AA✏A2A ZZZZ NULL
AA✏A NULL
NONSENSE NULL