在 REPLACE 函数中使用列值作为字符串模式

问题描述 投票:0回答:1

我正在尝试从一大堆应用程序名称中删除版本后缀(

_v1
...)。

例如,假设我有以下数据:

CREATE TABLE applications 
 (
   name varchar(20)
 );

INSERT INTO applications
 (name)
VALUES
 ('MyApp_v2'),
 ('MyApp_v1'),
 ('MyApp'),
 ('YourApp_R1');

我通常可以通过嵌套大量替换语句来做到这一点:

SELECT REPLACE(REPLACE(REPLACE(
         name,
       '_R1', ''),
       '_v2', ''),
       '_v1', '')
       As AppNameWithoutSuffix
FROM applications

但是我有很多版本号需要检查,所以我希望有更干净的东西。 基于以下问题:

我想创建一个存储所有前缀的 CTE,然后

REPLACE
它们都像这样:

;WITH versions (suffix) AS (
    SELECT '_R1' UNION ALL
    SELECT '_v2' UNION ALL
    SELECT '_v1'
)
SELECT REPLACE(a.name, v.suffix, '') As AppNameWithoutSuffix
FROM applications a,
     versions v

但这并不完全有效。 多个 from 语句为我提供了两个表的笛卡尔积,并且仅删除值恰好对齐的行上的后缀。

Sql Fiddle 中的演示

注意:我知道我可以将其转换为函数,但如果可能的话,我宁愿将所有内容都保留在单个查询中。

sql sql-server replace
1个回答
3
投票

这样就可以了:

;WITH versions (suffix) AS (
    SELECT '_R1' UNION ALL
    SELECT '_v2' UNION ALL
    SELECT '_v1'
)
SELECT  name, 
        REPLACE(A.name,ISNULL(B.suffix,''),'') VersionlessName
FROM applications A
LEFT JOIN versions B
    ON A.name LIKE '%'+B.suffix

结果是:

╔════════════╦═════════════════╗
║    name    ║ VersionlessName ║
╠════════════╬═════════════════╣
║ MyApp_v2   ║ MyApp           ║
║ MyApp_v1   ║ MyApp           ║
║ MyApp      ║ MyApp           ║
║ YourApp_R1 ║ YourApp         ║
╚════════════╩═════════════════╝

这里是修改后的sqlfiddle。

© www.soinside.com 2019 - 2024. All rights reserved.