SQL替换函数,如何替换单个字母
我的代码如下:SQL替换函数,如何替换单个字母,sql,sql-server,Sql,Sql Server,我的代码如下: REPLACE(REPLACE(cc.contype,'x','y'),'y','z') as ContractType, 这个替换是我想要的,但不幸的是,它在我想要的时候把所有的“z”都改成了“y” x>y y>z 这有意义吗?我不希望所有的新Y在我的第二个替换函数中再次改变。在microsoftaccess中,我将使用以下命令执行此操作 Iif(cc.contype=x,y,Iif(cc.contype=y,x)) 但是我不知道如何用SQL来表达这一点,我最好用客户端语言来
REPLACE(REPLACE(cc.contype,'x','y'),'y','z') as ContractType,
这个替换是我想要的,但不幸的是,它在我想要的时候把所有的“z”都改成了“y”
x>yy>z 这有意义吗?我不希望所有的新Y在我的第二个替换函数中再次改变。在microsoftaccess中,我将使用以下命令执行此操作 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,
并不是说我非常喜欢处理子列的性能降低过程,但在我看来,只要颠倒顺序就可以做到这一点:
replace(replace(cc.contype,'y','z'),'x','y') as ContractType,
这将在将x
字符转换为y
之前,将所有y
字符转换为z
如果您想要更通用的解决方案,可以执行联合查询,如:
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
根本不必处理子字符串(当然,只需在字符串前面加前缀,而不是修改它,以及添加任何其他必需的条件)。这通常比每行函数更有效
为了提高效率,一些数据库管理系统实际上会并行运行这些子查询
当然,理想的解决方案是更改模式,这样就不必处理子列。将
contype
列一分为二,将第一个字符存储到contype\u first
和contype\u 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 ...
与在每行上重复进行字符串替换的查询相比,这两个查询可能要快得惊人
即使不能用两个独立的列替换单个列,也至少可以创建两个新列,并使用insert/update触发器使它们保持同步。这为您提供了访问contype
信息的旧方法和新的改进方法
虽然这在技术上违反了3NF,但出于性能原因,这通常是可以接受的,只要您理解并减轻风险(使用触发器)。如果您不希望新的“y”变为“z”,请尝试另一种方法: 怎么样 替换(替换(替换(cc.contype,'x','ahhgh'),'y','z'),'ahhgh','y')为合同类型
啊,你可以用任何你喜欢的东西来代替。你最初改变顺序的做法已经奏效,但尽管是一个解决方案,但它并不像我希望的那样强大。特别是对于未来类似性质的工作。您的第二个解决方案似乎更符合我的要求,但我对UNION函数非常陌生。我将返回并修改此函数,并在将来使用此解决方案(如果可行!)谢谢。@Walter,
union
只运行两个查询并将所有行合并到一个集合中union
将删除重复项,union all
将不删除重复项。在这种情况下,由于两个子查询具有不同的值(signed…
vsestimate…
),因此不需要额外的重复删除步骤。
REPLACE(REPLACE(cc.contype,'y','z'),'x','y') as ContractType