【问题标题】:How to change the value of a column based on a substring of it?如何根据列的子字符串更改列的值?
【发布时间】:2016-05-23 15:53:23
【问题描述】:

我正在从数据库中提取数据进行分析,但遇到了问题。本质上,我有一列表示销售的进度计划。这些列的值可以是“Green”、“Red”或“?”,但它们后面都有一个唯一的描述,例如Green - Good to proceedGreen- Ready to move forwardRed -Do not proceed 等。

我需要的唯一数据是相应的“红色”“绿色”或“?”值,我不需要它们后面的描述。目前我所做的只是使用 SUBSTRING 获取每行的第一个字母,所以我最终得到了诸如 R, G, R, ?, ? etc.. 之类的值然后在 excel 中我可以进行查找和替换以重命名它们,但这是一个额外的步骤我认为没有必要。如果我尝试取前 5 个字母,我最终会得到某些行的数据,例如 Red -, or Red-D,这是我无法使用的。

有没有办法可以更改查询中列的值?我已经尝试过类似

的东西
SELECT CASE WHEN SUBSTRING(columnName, 1, 1) = 'G' THEN 'Green'
       ,CASE WHEN SUBSTRING(columnName, 1, 1) = 'R' THEN 'Red'
       etc.....

我尝试根据子字符串值更改值, 但这不起作用。谁能为此提供替代解决方案?

【问题讨论】:

  • 创建一个类似progress_type(progress_type_id, color, shortcut description)的表,并且只在你的数据表中存储一个外键progress_type_id
  • 从颜色后面的注释上显示的差异来看,“描述”可能需要保留在原始表格中;但我同意移动进度“代码”。

标签: mysql sql substring vertica


【解决方案1】:

你可以试试这样的。这是sqlfiddle

 select case substring(mystring,1,1)
        when 'G' then 'Green'
        when 'R' then 'Red'
        else '?'
    end as mycolumn from test;

【讨论】:

  • 谢谢!这似乎很有效!真的很感激!
【解决方案2】:

您可以使用substringinstr 的组合。

select substring(columnname,1,instr(columnname,'-')-1) as color
from tablename

【讨论】:

    【解决方案3】:

    如果值总是包含字符' -',并且我们只想返回出现在之前的字符,我们可以使用MySQL SUBSTRING_INDEX 函数。例如:

    SELECT SUBSTRING_INDEX(t.mystring,' -',1) 
         , ...
      FROM test t
    

    请注意,如果 mystring 的任何值不包含字符 ' -',则表达式将返回完整的 mystring。

    这只是众多可能的表达方式之一。

    【讨论】:

    • 感谢您的评论!不幸的是,并非所有数据都是这样格式化的。 @cableload 的建议似乎对我有用,所以我想我会暂时接受它
    【解决方案4】:

    Like 可以在需要更多灵活性时使用,并确保您不必担心有人插入“Grey”。

    SELECT CASE
          WHEN columnName LIKE 'Green%' THEN 'Green'
          WHEN columnName LIKE 'Red%' THEN 'Red'
          ELSE '?'
          END AS `status`
    FROM ....
    

    另外,LIKE 不以通配符开头的语句可以有时利用索引;像SUBSTRING 这样的函数调用几乎从来没有(如果有的话)可以。

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多