我的代码如下:
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,
答案 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_first
和contype_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可以替换为你喜欢的任何东西。