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

时间:2014-08-11 20:59:45

标签: sql sql-server replace

我正试图从一大堆应用名称中删除版本后缀(_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语句为我提供了两个表的笛卡尔积,并且只删除了值恰好排列的行的后缀。

Demo in Sql Fiddle

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

1 个答案:

答案 0 :(得分: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         ║
╚════════════╩═════════════════╝

here is修改后的sqlfiddle。