SQL REPLACE函数,如何替换单个字母

时间:2011-09-06 08:51:15

标签: sql sql-server

我的代码如下:

REPLACE(REPLACE(cc.contype,'x','y'),'y','z') as ContractType,

这个REPLACE是正确的我想要的,但它不幸的是当我想要时将所有“z”改为“y”而

x> ÿ
y> ž

这有意义吗?我不希望所有的新Y在我的第二个REPLACE函数中再次改变。在Microsoft Access中,我将使用以下

执行此操作

Iif(cc.contype = x,y,iif(cc.contype = y,x))

但我不确定如何在SQL中表达这一点,我最好用客户端语言做这种事情吗?

非常感谢。

编辑:也试过没有运气:

       CASE WHEN SUBSTRING(cc.contype, 1, 1) = 'C'
        THEN REPLACE(cc.contype, 'C', 'Signed')
       CASE WHEN SUBSTRING(cc.contype, 1, 1) = 'E'
        THEN REPLACE(cc.contype, 'E', 'Estimate') as ContractType,

3 个答案:

答案 0 :(得分:6)

如果你不希望新的“y”成为“z”,那就试着反过来做:

REPLACE(REPLACE(cc.contype,'y','z'),'x','y') as ContractType

答案 1 :(得分:4)

并不是说我是处理子列的性能查杀过程的忠实粉丝,但在我看来,只需颠倒顺序就可以做到这一点:

replace(replace(cc.contype,'y','z'),'x','y') as ContractType,

在将y个字符转换为z之前,这会将所有x个字符转换为y


如果您正在使用更通用的解决方案,则可以执行联合查询,例如:

select 'Signed: ' || cc.contype as ContractType
    wherecc.contype like 'C%' from wherever
union all select 'Estimate: ' || cc.contype as ContractType
    where cc.contype like 'E%' from wherever

根本不必乱用子串(以字符串为前缀而不是修改它,并且当然也添加任何其他所需条件)。这通常比每行函数更有效。

为了提高效率,有些DBMS会实际并行运行这些子查询。


当然,理想解决方案是更改您的架构,以便您不拥有来处理子列。将contype列分隔为两列,将第一个字符存储到contype_firstcontype_rest

然后,只要您想要完整contype

select contype_first || contype_rest ...

对于您目前的查询,您可以使用查找表:

lookup_table:
    first char(1) primary key
    description varchar(20)

含有:

first  description
-----  -----------
C      Signed: 
E      Estimate:

和查询:

select lkp.description || cc.contype_rest
    from lookup_table lkp, real_table cc
    where lkp.first = cc.first ...

与在每行上重复字符串替换的查询相比,这两个查询都可能非常快。

即使您不能替换具有两个独立列的单列,您至少可以创建两个新列,并使用插入/更新触发器使它们保持同步。这为您提供了旧方法和访问contype信息的新方法。

虽然这在技术上违反了3NF,但出于性能原因这通常是可以接受的,只要您了解并降低风险(使用触发器)。

答案 2 :(得分:0)

怎么样 REPLACE(REPLACE(cc.contype,'x','ahhhgh'),'y','z'),'ahhhgh','y')作为ContractType,

ahhhgh可以替换为你喜欢的任何东西。