Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 - Fatal编程技术网

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>y
y>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…
vs
estimate…
),因此不需要额外的重复删除步骤。
REPLACE(REPLACE(cc.contype,'y','z'),'x','y') as ContractType