Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 我可以使用替换为通配符吗_Sql Server - Fatal编程技术网

Sql server 我可以使用替换为通配符吗

Sql server 我可以使用替换为通配符吗,sql-server,Sql Server,因此,varchar变量可以有'Y,N,X'或'X,Y,N'或'Y,X,N'或'X' 我想用空字符串替换它X和“” 例如 如果@value='Y,N,X'或'X,Y,N'或'Y,X,N'或'X' 然后将x替换为如下所示 ='Y,N'或'Y,N'或'Y,N'或 输入 “Y,N,X” “X,Y,N” “Y,X,N” “X” 输出 “是的,不是” “是的,不是” “是的,不是” 我认为这是我能做的最简单的SQL,因为SQL Server不支持正则表达式 创建表t f nvarchar50; 在t值中插

因此,varchar变量可以有'Y,N,X'或'X,Y,N'或'Y,X,N'或'X'

我想用空字符串替换它X和“” 例如 如果@value='Y,N,X'或'X,Y,N'或'Y,X,N'或'X' 然后将x替换为如下所示 ='Y,N'或'Y,N'或'Y,N'或

输入 “Y,N,X” “X,Y,N” “Y,X,N” “X” 输出 “是的,不是” “是的,不是” “是的,不是”
我认为这是我能做的最简单的SQL,因为SQL Server不支持正则表达式

创建表t f nvarchar50; 在t值中插入'Y,N,X','X,Y,N','Y,X,N','X'; t2为 -使所有项目都有一个字符串逗号,并删除项目X 选择replacef+'、'、'X',f2 从t -删除最右侧项目的逗号(不带项目的数据除外) 选择f2时的case,然后选择leftf2,lenf2-1 else结束f3 从t2开始; 我在看了Manh Nguyen的文章后再加上一个答案

他回答时使用了string_split和string_agg函数

-在排除项目“X”后用逗号连接 选择字符串_aggs.value','f2 从…起 -在排除项目“X”后生成要加入的行号 通过选择1 rnum在订单上选择行号, F 从t T 交叉应用字符串 其中s.value'X' 按t.rnum分组 使用string_split和string_agg函数很容易理解

但这并不简单,因为在使用string_agg函数时,需要为每个项目生成唯一的行号来收集正确的项目


也许你可以根据不同的情况选择不同的方式。

我不确定你到底需要什么

但我认为您需要从以下位置编辑SQL语句:

REPLACE(REPLACE(REPLACE(REPLACE(@value,',x,',''),'x,',''),',x',''),'x','') 

-将',x'替换为',而不是空字符串


对于SQL Server 2017 14.x及更高版本中的值“YN”而不是“Y,N”

,您可以使用STRING\u SPLIT和STRING\u AGG来拆分/连接字符串数据

运行下面的测试代码以检查

DECLARE @value NVARCHAR(20) = 'X,Y,X,Z,X'
DECLARE @wildcard NVARCHAR(10) = 'X'
DECLARE @separator NVARCHAR(10) = ','

SELECT STRING_AGG(VALUE, @separator) as 'Result' 
FROM STRING_SPLIT (@value, @separator) 
WHERE VALUE <> @wildcard
结果


如果您将输入限制为4个选项,其中3个映射到相同的输出,那么只需查找“X”。如果它不是X,那么假设它映射到“Y,N”?您不想使用4种替换方法的原因是什么?你也许能找到其他有效的方法……但它们不一定更有效。而且其他方法也可能不容易阅读。例如,我正在考虑其他方法来获得相同的结果,但它仍然涉及与您的示例中相同或更多的函数。你只是不喜欢它的样子吗?
DECLARE @value NVARCHAR(20) = 'X,Y,X,Z,X'
DECLARE @wildcard NVARCHAR(10) = 'X'
DECLARE @separator NVARCHAR(10) = ','

SELECT STRING_AGG(VALUE, @separator) as 'Result' 
FROM STRING_SPLIT (@value, @separator) 
WHERE VALUE <> @wildcard