如何根据它的子字符串更改列的值?

How to change the value of a column based on a substring of it?

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

我唯一需要的数据是相应的 "Red" "Green" 或“?”价值,我不需要他们后面的描述。目前我所做的就是使用 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.....

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

您可以组合使用 substringinstr

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

你可以尝试这样的事情。这里是 sqlfiddle

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

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

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

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

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

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

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

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