【问题标题】:Check for a substring in MySQL and return a value based on it检查 MySQL 中的子字符串并根据它返回一个值
【发布时间】:2016-05-26 06:17:44
【问题描述】:

我有一个返回以下值的 SQL 查询:

BC - Worces
BC Bristol
BC Central
BC Torquay
BC-Bath
BC-Exeter
BC-Payroll

所以,我们有一些只有一个空格的 BC,一些有一个破折号,一些有一个破折号,两边都有空格。返回这些值时,我想用“业务连续性:”替换这些 BC 变体中的任何一个,然后是 Bath 或 Exeter 等。

有没有办法检查返回的值和(我假设在单独的列中)基于它返回一个字段?如果每次迭代都相同,我可以只使用 Trim,但正是这种变化让我失望了。

【问题讨论】:

  • 是唯一使用“”和“-”字符的变体吗?
  • 嵌套替换语句怎么样?

标签: mysql sql string substring


【解决方案1】:

你可以在 select 上使用 case

CASE WHEN Left(`colname`, 5) = 'BC - ' THEN CONCAT('Business Continuity: ', SUBSTRING(`colname`, 6))
     WHEN Left(colname, 3) = 'BC ' THEN CONCAT('Business Continuity: ', SUBSTRING(`colname`, 4))
     WHEN Left(`colname`, 3) = 'BC-' THEN CONCAT('Business Continuity: ', SUBSTRING(`colname`, 4))
     ELSE `colname`
END as `colname`

【讨论】:

  • 这是最可靠的解决方案,因为它只查看前 3-5 个字符。唯一的缺点是它使用了一个案例,但它可能并不重要。
  • @tmutton - 大小写是不好的做法吗?
  • @tmutton 请解释为什么一个案例在这个答案中是否定的。
  • @Fred Speed。但这可能无关紧要。
  • 完全不是问题。很高兴你得到了答案。
【解决方案2】:

您可以为此使用REPLACE 函数和CASE 语句。

SELECT CASE 
    WHEN `col_name` LIKE 'BC %' THEN REPLACE(`col_name`, 'BC ', 'Business Continuity: ') 
    WHEN `col_name` LIKE 'BC-%' THEN REPLACE(`col_name`, 'BC-', 'Business Continuity: ')
    ELSE `col_name`
    END as `col_name` FROM `table_name`;

【讨论】:

  • 如果城镇名称中包含 BC 怎么办?不是一个可靠的解决方案。
  • @tmutton:注意LIKE 子句'BC %' 中的字符串文字。您可以看到% 仅在BC<space> 之后。因此,它将仅匹配所有以BC<space> 开头的条目。 [同上BC-]。而且我认为没有任何城镇仅以 BC 命名;)
【解决方案3】:

*未测试

select 'Business Continuity:' + SUBSTRING(REPLACE(fieldname, 'BC - ', 'BC-'), 4) from table;
  1. 将“BC -”的所有实例替换为“BC-”。
  2. 子字符串从 4 个字符开始,即 'BC-' 和 'BC'

【讨论】:

  • 正要自己发布这个。经过测试,它可以工作。
  • 关注的是删除这三个实例。删除它们后,您将得到所需的东西,然后只需按一下字符串即可。
  • 只有在没有空格、破折号或 BC 的情况下才有效
  • @dnoeth 我不明白。在 OP 提到的情况下,它会删除它需要的部分。你能解释一下你的评论吗?
  • 现在应该修复了。
猜你喜欢
  • 1970-01-01
  • 2022-10-26
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多