Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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中的多个字符_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

替换SQL中的多个字符

替换SQL中的多个字符,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个问题,我想替换字符 我正在使用replace函数,但它并没有给出所需的输出 列table_value的值需要替换为它们的填充名,如 电子邮件 电话 M会议 我正在使用这个查询 select table_value, replace(replace(replace(table_value, 'M', 'MEETING'), 'E', 'EMAIL'), 'P', 'PHONE') required_value from foobar 所以第二个必需的值行应该是电子邮件、

我有一个问题,我想替换字符

我正在使用replace函数,但它并没有给出所需的输出

列table_value的值需要替换为它们的填充名,如

电子邮件 电话 M会议

我正在使用这个查询

select table_value, 
       replace(replace(replace(table_value, 'M', 'MEETING'), 'E', 'EMAIL'), 'P', 'PHONE') required_value 
from foobar
所以第二个必需的值行应该是电子邮件、电话、会议等等

我应该怎么做才能使所需的值正确?

即使不是智能解决方案,下面的内容也会起作用


您可以使用CTE将表值拆分为E、p和M,然后替换并重新组合在一起

我假设每条记录都有一个唯一的标识符Id,但请用您拥有的任何内容替换它

;WITH cte
AS
(
    SELECT Id, SUBSTRING(table_value, 1, 1) AS SingleValue, 1 AS ValueIndex
    FROM replacetable

    UNION ALL

    SELECT replacetable.Id, SUBSTRING(replacetable.table_value, cte.ValueIndex + 1, 1) AS SingleValue, cte.ValueIndex + 1 AS ValueIndex
    FROM cte
    INNER JOIN replacetable ON cte.ValueIndex < LEN(replacetable.table_value)
)

SELECT DISTINCT Id, 
    STUFF((SELECT DISTINCT ','+ CASE SingleValue 
            WHEN 'E' THEN 'EMAIL'
            WHEN 'P' THEN 'PHONE'
            WHEN 'M' THEN 'MEETING'
        END
       FROM cte c 
       WHERE c.Id = cte.Id 
       AND SingleValue <> ','
       FOR XML PATH ('')),1,1,'')
FROM cte

抱歉,对于混乱代码,也许这不是解决此问题的最佳方法,但我尝试过:

SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
GO
CREATE Function [dbo].[fn_CSVToTable] 
(
    @CSVList Varchar(max)
)
RETURNS @Table TABLE (ColumnData VARCHAR(100))
AS
BEGIN
    DECLARE @S varchar(max),
        @Split char(1),
        @X xml

    SELECT @Split = ','

    SELECT @X = CONVERT(xml,' <root> <s>' + REPLACE(@CSVList,@Split,'</s> <s>') + '</s>   </root> ')

    INSERT INTO @Table
    SELECT CASE  RTRIM(LTRIM(T.c.value('.','varchar(20)'))) WHEN 'M' THEN 'Meeting'
        WHEN 'P' THEN 'Phone'
        WHEN 'E' THEN 'Email'
        End

    FROM @X.nodes('/root/s') T(c)

    RETURN
END
GO
我明白了:

table_value                                        ColumnData
-------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
E,P                                                Email,Phone
E,P,M                                              Email,Phone,Meeting
P,E                                                Phone,Email
P,M                                                Phone,Meeting

(4 row(s) affected)

您还可以使用解码或大小写来转换值。

您可能应该将表中的值拆分为E、p和M,然后替换并放回一起。@Szymon:怎么做?每个记录是否也有某种唯一的id?您的查询给了我一个错误-无效的对象名“replacetable”。因为您没有用实际的表名替换它?replacetable必须是什么样的?
Select Main.table_value,
       Left(Main.ColumnData,Len(Main.ColumnData)-1) As ColumnData
From
    (
        Select distinct tt2.table_value, 
            (
                Select tt1.ColumnData+ ',' AS [text()]
                From (
                SELECT 
                    *
                    FROM  dbo.TestTable tt
                    CROSS APPLY dbo.fn_CSVToTable(tt.table_value)
                ) tt1
                Where tt1.table_value = tt2.TABLE_value
                ORDER BY tt1.table_value
                For XML PATH ('')
            ) ColumnData
        From dbo.TestTable tt2
    ) [Main]
table_value                                        ColumnData
-------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
E,P                                                Email,Phone
E,P,M                                              Email,Phone,Meeting
P,E                                                Phone,Email
P,M                                                Phone,Meeting

(4 row(s) affected)