我正试图从一大堆应用名称中删除版本后缀(_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语句为我提供了两个表的笛卡尔积,并且只删除了值恰好排列的行的后缀。
注意:我知道我可以将其转换为函数,但如果可能的话,我宁愿将所有内容保存在单个查询中。
答案 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。