dar*_*nte 6 sql-server replace char chars difference
我NVARCHAR(10)在表格中有一列.它可以存储任何类型的UNICODE字符串.
我想用'0'替换每个不同于'1'的字符.
假设我有字符串'012345C18*'.我应该得到'0100000100'.
我设法使用一个帮助表来完成它,该表包含从1到我的列(10)大小的索引,如下所示:
CREATE TABLE HELP(Idx INT)
INSERT INTO HELP
SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
DECLARE @myStr VARCHAR(10)
SET @myStr = '012345C18*'
SELECT STUFF((SELECT '' + CASE(B.Ch) WHEN '1' THEN '1' ELSE '0' END FROM (
SELECT SUBSTRING(A.Val,H.Idx,1) AS Ch
FROM
(SELECT @myStr AS Val) A
CROSS JOIN HELP H
)B FOR XML PATH('')),1,0,'')
Run Code Online (Sandbox Code Playgroud)
它有效,但可以以更好的方式完成吗?这对于简单的更新来说似乎很难看,忽略了列的大小可能随时间变化的事实.它还必须在SQL> = 2005上运行.
SQL小提琴 在这里
谢谢!
使用递归查询稍微不同的方法:
WITH cte AS
( SELECT v, i = 0,
nv = CAST('' AS NVARCHAR(10))
FROM t
UNION ALL
SELECT v, i+1,
CAST(nv + CASE WHEN SUBSTRING(v, i+1, 1) = '1' THEN '1' ELSE '0' END
AS NVARCHAR(10))
FROM cte
WHERE i+1 <= LEN(v)
)
SELECT v, nv
FROM cte
WHERE i = LEN(v) ;
Run Code Online (Sandbox Code Playgroud)
在SQLFiddle中测试过
这是用cte做这个的方法.在我的系统中,我实际上将ctes作为视图名称cteTally.此技术生成10,000行视图,读取为零.;)您发布的代码运行良好.对于此示例,我将字符串移动到表中,因为这是您在实际系统中使用的内容.
declare @myStrings table(MyVal varchar(10));
insert @myStrings
select '012345C18*';
WITH
E1(N) AS (select 1 from
(
select (1) union all
select (1) union all
select (1) union all
select (1) union all
select (1) union all
select (1) union all
select (1) union all
select (1) union all
select (1) union all
select (1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
SELECT STUFF((SELECT '' + CASE(B.Ch) WHEN '1' THEN '1' ELSE '0' END FROM (
SELECT SUBSTRING(A.MyVal, t.N, 1) AS Ch
FROM
@myStrings A
CROSS JOIN cteTally t
where t.N < LEN(a.MyVal)
)B FOR XML PATH('')),1,0,'')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
727 次 |
| 最近记录: |