如何编写SQL查询以从选定列中删除给定的一组特殊字符?
我有一张桌子 当我询问如何编写SQL查询以从选定列中删除给定的一组特殊字符?,sql,sql-server,tsql,sql-server-2017,Sql,Sql Server,Tsql,Sql Server 2017,我有一张桌子 当我询问 SELECT [XYZ] from [ABCTable] 返回的[XYZ]行集可能包含-[~]、[!]、[@]、[#]、[$]、[%]、[^]、&]、[*]、[、]、[.]、[?] 有没有办法只写一个SQL查询(而不是存储过程或子例程)来确保在选择所需数据时删除这些字符?是否需要类似的操作 CREATE TABLE T( ID INT IDENTITY(1,1), Value VARCHAR(45) ); INSERT INTO T(Value) VALUE
SELECT [XYZ] from [ABCTable]
返回的[XYZ]行集可能包含-[~]、[!]、[@]、[#]、[$]、[%]、[^]、&]、[*]、[、]、[.]、[?]
有没有办法只写一个SQL查询(而不是存储过程或子例程)来确保在选择所需数据时删除这些字符?是否需要类似的操作
CREATE TABLE T(
ID INT IDENTITY(1,1),
Value VARCHAR(45)
);
INSERT INTO T(Value) VALUES
('.A*B$C@'),
('D#E$,F'),
('.G,H*I@$');
DECLARE @Chars VARCHAR(45) = '@$.,*#';
SELECT *, REPLACE(TRANSLATE(Value, @Chars, REPLICATE(' ', LEN(@Chars))), ' ', '') Result
FROM T;
返回:
+----+----------+--------+
| ID | Value | Result |
+----+----------+--------+
| 1 | .A*B$C@ | ABC |
| 2 | D#E$,F | DEF |
| 3 | .G,H*I@$ | GHI |
+----+----------+--------+
注意:如果您有空白,我建议您使用CHAR(9)
作为
REPLACE(TRANSLATE(Value, @Chars, REPLICATE(CHAR(9), LEN(@Chars))), CHAR(9), '')
创建可以为您执行此操作的函数。有什么原因不能只对每个字符使用
REPLACE
吗?在SQL Server中,这通常使用大量嵌套的REPLACE
来完成,因为它缺少translate
和RegExp\u REPLACE
:-(不完全正确@dnoeth@Larnu:Great,最终在SQL Server 2017中可用,但为什么MS以不同的方式实现它,因此它不能用于删除字符(不知道列中不存在的字符,并添加最终的替换)?正如我在评论中所写,您需要将其嵌套在替换中,希望数据中没有空格…此解决方案适用于您提供的示例数据,但我不会使用空格作为虚拟替换值。显然,有空格的值会弄乱。我会使用CHAR(1)或其他不太常见的字符。