我尝试执行一个脚本来消除字符串中的中文字符以及我想要删除的中文字符之间的中文字符。请参考下面的示例。谢谢。
select LTRIM(SUBSTRING('Tower 6A 第6A座', PATINDEX('%[a-zA-Z0-9]%', 'Tower 6A 第6A座'), LEN('Tower 6A 第6A座')))
select LTRIM(REPLACE(SUBSTRING('Tower 6A 第6A座', CHARINDEX(N'樓', 'Tower 6A 第6A座') + 1, LEN('Tower 6A 第6A座')), ' ', ''))示例字符串:
Tower 6A 第6A座
Tower 3 第3座错误结果:
Tower 6A ?6A?
Tower6A?6A?
Tower 3 ?3?
Tower3?3?很好的结果,我想实现:
Tower 6A
Tower 6A
Tower 3
Tower 3发布于 2017-07-24 16:40:26
尝尝这个
SELECT Replace(Replace('Tower 6A 第6A座','[^a-zA-Z0-9]+', ''),'?','')发布于 2017-07-24 16:02:22
看起来很奇怪,但工作很有效。然而,我不会指望很好的性能:
;WITH string AS (
SELECT N'Tower 6A 第6A座' s
),
split AS (
select LEFT(s, 1) s_item,
STUFF(s, 1, 1, N'') s
from string
union all
select LEFT(s, 1),
STUFF(s, 1, 1, N'')
from split
where s > ''
)
,
remove_non_ascii AS (
SELECT s_item, UNICODE(s_item) s_unicode
FROM split WHERE UNICODE(s_item)<256
)
SELECT STUFF((SELECT s_item FROM remove_non_ascii
FOR XML PATH, TYPE).value('.[1]', 'NVARCHAR(MAX)'), 1,0, '');它的用途:
将字符串拆分成大于256的UNICODE字符(您可以摆弄condition)
它使用递归查询,因此在字符串超过100个字符的情况下,您需要通过添加:OPTION (MAXRECURSION n) (其中n是新的递归循环数量)来扩展递归循环的数量。
发布于 2017-07-24 16:13:46
尝尝这个
;With cte(Data)
AS
(
SELECT 'Tower 6A 第6A座' UNION ALL
SELECT 'Tower 3 第3座'
)
SELECT
CASE WHEN CHARINDEX('Tower', DATA)= 0 THEN 'Tower ' + DATA ELSE DATA END AS DATA
FROM
(
SELECT
Split.a.value('.', 'VARCHAR(1000)') AS Data
FROM
(
SELECT CAST('<S>' + REPLACE(REPLACE(Data, '?', '</S><S>'),'','</S><S>') + '</S>' AS XML) AS Data
FROM cte
) AS
A CROSS APPLY Data.nodes('/S') AS Split(a)
) DT
Where
DT.Data <> ''结果
DATA
----------
Tower 6A
Tower 6A
Tower 3
Tower 3https://stackoverflow.com/questions/45274496
复制相似问题