【问题标题】:Conditional replacement depending on other column value根据其他列值进行条件替换
【发布时间】:2018-11-13 22:49:05
【问题描述】:

我有一个包含以下表格的数据库:

********************************
* Code  *      FileName        *
********************************
* NULL  * Cats and Dogs        *
* C123  * C123 - Cats and Dogs *
* NULL  * Baking Cakes         *
* Z345  * Z345 - Plants        *
* F967  * E345 - Tractors      *
********************************

我想返回所有行的文件名或操作文件名,这取决于代码列中是否存在值并且它与文件名中的代码匹配。

所以查询应该返回

Cats and Dogs
xxxx - Cats and Dogs
Baking Cakes
xxxx - Plants
E345 - Tractors

从以上数据集。

我正在努力对另一列中的值进行条件替换 - 如果我使用 case 语句执行此操作,我需要列出所有可能的代码,这将难以维护。有什么办法吗

Select Replace(FileName, Code, "xxxx") from table where filename like %Code%

【问题讨论】:

  • 你写的查询有什么问题?这看起来非常接近可能对你有用的东西。当然,最好的答案是替换正则表达式,但 SQL Server 不支持这个开箱即用。
  • 我想我想多了 - 但这特别没有返回没有代码的值。案例陈述的其他回应是我所需要的!

标签: sql replace conditional


【解决方案1】:

您可以尝试以下查询:

SELECT
    CASE WHEN Code IS NULL
         THEN FileName
         ELSE REPLACE(FileName, Code + ' - ', 'xxxx - ') END AS label
FROM yourTable;

Demo

这里不一定需要WHERE 子句,因为替换逻辑已经检查是否存在匹配项。请注意,我搜索code -,即您期望的上下文中的代码。这至少部分减轻了错误替换的可能性。

【讨论】:

  • 用户想从他的帖子中获取结果集,我在我的回答中截屏了
  • 感谢 - 正确使用 Case 语句来获得我需要的东西 - 虽然我不需要额外的搜索 - 将这个标记为解决方案而不是另一个CHARINDEX,因为它似乎没有必要。
【解决方案2】:

试试这个

CREATE TABLE #tmp (Code varchar(25), FileName varchar (25))

INSERT INTO #tmp VALUES
(NULL, 'Cats and Dogs '),
('C123', 'C123 - Cats and Dogs'),
(NULL, 'Baking Cakes'),
('Z345', 'Z345 - Plants'),
('F967', 'E345 - Tractors')

SELECT  
CASE 
      WHEN CHARINDEX(Code, FileName,1)>0 THEN Replace(FileName, Code, 'xxxx') 
      ELSE FileName 
END As Result
FROM #tmp

【讨论】:

  • 我不会使用CHARINDEX 来表达替换。除了代码可能是NULL 之外,进行一揽子更换没有任何问题。所以我认为你应该检查NULL 代码。
  • 出于好奇,为什么不呢?如果 Code=NULL 不会 char index =0?此外,如果 code & filename = NULL 替换将只是发送回正确的输出(这将是空的)?随意解释:)
  • replace 函数已经隐式地仅在找到目标中的子字符串时才执行某些操作。所以打电话给CHARINDEX 对我来说似乎是多余的。
猜你喜欢
  • 2019-02-12
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 2021-10-24
相关资源
最近更新 更多