我正在尝试从一大堆应用程序名称中删除版本后缀(
_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
但是我有很多版本号需要检查,所以我希望有更干净的东西。 基于以下问题:
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 语句为我提供了两个表的笛卡尔积,并且仅删除值恰好对齐的行上的后缀。
注意:我知道我可以将其转换为函数,但如果可能的话,我宁愿将所有内容都保留在单个查询中。
这样就可以了:
;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。