在创建基于单个表的视图时,我想替换所有出现的特定单个字符串(例如:'^' 或 ',')。但 id 不会替换所有数据行中所需的单个字符。当我查询新创建的视图时,我就知道了。所有字段都有 varchar 数据类型。
这是一个特定的示例,其中没有替换愿望字符串MAINTENANCEà ,¿ENHANCED 我尝试了以下但没有成功。
SELECT REPLACE('MAINTENANCE¿ENHANCED',',','')
SELECT REPLACE('MAINTENANCE¿ENHANCED',char(33),'')
SELECT REPLACE(N'MAINTENANCE¿ENHANCED',',','')
SELECT REPLACE('MAINTENANCE¿ENHANCED',N',','')
SELECT REPLACE(CAST('MAINTENANCE¿ENHANCED' as NVARCHAR(50)),N',','')
SELECT REPLACE(CAST('MAINTENANCE¿ENHANCED' as VARCHAR(50)),N',','')
SELECT REPLACE(TRY_CAST('MAINTENANCE¿ENHANCED' as VARCHAR(50)),N',','')
SELECT REPLACE(CONVERT(VARCHAR(50),'MAINTENANCE¿ENHANCED'), N',','')
我还执行了简单的测试,我从需要替换的字符串中复制了逗号(请参阅下面的代码)
如果 ',' = '‚' print 1 -- 不返回 TRUE。第一个逗号是我在 REPLACE 函数的第二个参数中键入的那个,第二个逗号是从上面的字符串中复制的那个。
如果 ',' = ',' 打印 1 -- 返回 TRUE。我在 REPLACE 函数的第二个参数中键入的两个逗号。
显然问题在于我在数据源中的逗号被平等对待。虽然下面的函数显示两者都是 varchar。(https://blog.sqlauthority.com/2013/12/15/sql-server-how-to-identify-datatypes-and-properties-of-variable)
**-- comma from the string**
DECLARE @myVar VARCHAR(100)
SET @myVar = '‚'
SELECT SQL_VARIANT_PROPERTY(@myVar,'BaseType') BaseType,
SQL_VARIANT_PROPERTY(@myVar,'Precision') Precisions,
SQL_VARIANT_PROPERTY(@myVar,'Scale') Scale,
SQL_VARIANT_PROPERTY(@myVar,'TotalBytes') TotalBytes,
SQL_VARIANT_PROPERTY(@myVar,'Collation') Collation,
SQL_VARIANT_PROPERTY(@myVar,'MaxLength') MaxLengths
--**regular comma**
SET @myVar = ','
SELECT SQL_VARIANT_PROPERTY(@myVar,'BaseType') BaseType,
SQL_VARIANT_PROPERTY(@myVar,'Precision') Precisions,
SQL_VARIANT_PROPERTY(@myVar,'Scale') Scale,
SQL_VARIANT_PROPERTY(@myVar,'TotalBytes') TotalBytes,
SQL_VARIANT_PROPERTY(@myVar,'Collation') Collation,
SQL_VARIANT_PROPERTY(@myVar,'MaxLength') MaxLengths
部分可以使用下面的代码解决
select Stuff('MAINTENANCE¿ENHANCED', PatIndex('%[^a-z0-9]%', 'MAINTENANCE¿ENHANCED'), 1, '')
输出 ——逗号被替换。这是预期的。MAINTENANCEÿENHANCED
但它在我有超过 1 个逗号的情况下不起作用,无论我是从数据源复制它还是自己输入它。('“维护”“增强”)
select Stuff('‚MAINTENANCE¿ENHANCED', PatIndex('%[^a-z0-9]%', '‚MAINTENANCE¿ENHANCED'), 1, '')
select REPLACE(Stuff('‚MAINTENANCE¿ENHANCED', PatIndex('%[^a-z0-9]%', '‚MAINTENANCE¿ENHANCED'), 1, ''),',','')
输出 ——逗号又回来了。是问题。只有一个(第一个)逗号被替换。AINTENANCE™ 增强型
附言
请参阅下面的答案,我解决了上述所有问题,除了我需要弄清楚如何防止删除特殊字符(如问号、括号等)。