22,209
社区成员
发帖
与我相关
我的任务
分享
DECLARE @s1 VARCHAR(20),@s2 VARCHAR(20)
SET @s1='123X56X89'
SET @s2='12XX56789'
;WITH tt1 AS (
SELECT sv.number AS id,SUBSTRING(t1.c,sv.number,1) AS c
FROM (SELECT @s1 AS c)AS t1 CROSS APPLY [master].dbo.spt_values AS sv
WHERE sv.[type]='P' AND sv.number BETWEEN 1 AND LEN(t1.c)
), tt2 AS (
SELECT sv.number AS id,SUBSTRING(t2.c,sv.number,1) AS c
FROM (SELECT @s2 AS c)AS t2 CROSS APPLY [master].dbo.spt_values AS sv
WHERE sv.[type]='P' AND sv.number BETWEEN 1 AND LEN(t2.c)
)
SELECT (
SELECT
CASE WHEN a.c=b.c THEN a.c
WHEN a.c='X' THEN b.c
ELSE a.c END
FROM tt1 AS a INNER JOIN tt2 AS b ON a.id=b.id
FOR XML PATH('')
) AS result
/*
result
123X56789
*/
declare @code_1 VARCHAR(20)
declare @code_2 VARCHAR(20)
set @code_1='123X56X89'
set @code_2='12XX56789'
SELECT A.CODE,
SEQ,
SUBSTRING(CODE,number,1) AS SINGLE_CHAR,
NUMBER
INTO #A
FROM (select @code_1 as CODE,1 as SEQ union all
select @code_2,2) AS A
JOIN master.dbo.spt_values B ON number<=LEN(CODE)
WHERE TYPE='P'
AND number>0
declare @new_code varchar(20)
select @new_code=isnull(@new_code,'')+SINGLE_CHAR_NEW
from
(SELECT A.number,
CASE WHEN A.SINGLE_CHAR='X' THEN B.SINGLE_CHAR ELSE A.SINGLE_CHAR END AS SINGLE_CHAR_NEW
FROM #A AS A
JOIN #A B ON A.SEQ=1 AND B.SEQ=2 AND A.number=B.number) as A
order by A.number
print @new_code
DROP TABLE #A
DECLARE @str1 varchar(9)
SET @str1='123X56X89'
DECLARE @str2 varchar(9)
SET @str2='12XX56789'
--将第4位X用Y代替
DECLARE @str1Aid varchar(9)
SET @str1Aid=substring(@str1,1,3)+'Y'+substring(@str1,5,len(@str1)-4)
--计算X个数
DECLARE @iXqty int
SET @iXqty=len(@str1Aid)-len(Replace(@str1Aid,'X',''))
DECLARE @i int
SET @i=1
While @i<=@iXqty
Begin
SET @str1Aid=Replace(@str1Aid,'X',Substring(@str2,Charindex('X',@str1Aid),1))
SET @i=@i+1
End
SET @str1=substring(@str1Aid,1,3)+'X'+substring(@str1Aid,5,len(@str1Aid)-4)
Select @str1
123X56789
IF OBJECT_ID(N'TEMPDB..#T') IS NOT NULL
DROP TABLE #T
GO
CREATE TABLE #T(CODE VARCHAR(20))
INSERT INTO #T
SELECT '123X56X89' UNION ALL
SELECT '12XX56789' UNION ALL
SELECT '12X056789'
WITH CTE_1
AS
(SELECT A.CODE,
SUBSTRING(CODE,number,1) AS SINGLE_CHAR,
NUMBER,
SEQ
FROM (SELECT *,ROW_NUMBER() OVER (ORDER BY GETDATE()) AS SEQ FROM #T) AS A
JOIN master.dbo.spt_values B ON number<=LEN(CODE)
WHERE TYPE='P'
AND number>0),
CTE_2
AS
(SELECT A.CODE,CASE WHEN A.SINGLE_CHAR='X' THEN B.SINGLE_CHAR ELSE A.SINGLE_CHAR END AS SINGLE_CHAR,
CAST(A.CODE AS VARCHAR)+'-'+CAST(B.CODE AS VARCHAR) AS GROUP_CODE FROM CTE_1 A
JOIN CTE_1 B ON A.SEQ<B.SEQ AND A.number=B.number)
SELECT DISTINCT CODE,
GROUP_CODE,
(SELECT CAST(SINGLE_CHAR AS VARCHAR) FROM CTE_2 WHERE A.GROUP_CODE=GROUP_CODE FOR XML PATH('')) AS NEW_CODE
FROM CTE_2 A
DECLARE @str1 varchar(9)
DECLARE @str2 varchar(9)
SET @str1='123X56X89'
SET @str2='12XX56789'
DECLARE @TagStr varchar(9)
SET @TagStr=''
DECLARE @i int
SET @i=1
DECLARE @iLen int
SET @iLen=Len(@str1)
While @i<=@iLen
Begin
IF @i<>4
SET @TagStr=@TagStr+Case when substring(@str1,@i,1)<>'X' then substring(@str1,@i,1) else substring(@str2,@i,1) end
Else
SET @TagStr=@TagStr+'X'
set @i+=1
End
Select @TagStr
---------
123X56789