在mysql中使用3个字符长度的大写字符串更新列

时间:2013-02-21 19:06:52

标签: mysql sql

我有一张类别表 我有这样的记录

id    |    name    |    symbol
1     | Feeders    |    FEE
2     | Ovens      |
3     | Routers    |

我在这张表中有很多记录。我想用类别名称更新符号字段,获取类别名称,提取3个随机字符(必须按顺序排列并始终选择第一个字符,随机2个)然后将它们转换为大写并应用更新。我怎么能这样做。
例如,我想要用OVE或OVN或OVS或OEN或OES等更新烤箱 我如何在一个查询中执行此操作。

这是我尝试过的,但它有时带来1个字符,有时2个,有时3个

UPDATE category
SET symbol = (select
        upper(SUBSTRING(name, 1+ FLOOR(RAND()*LENGTH(name)),3))
          from default_category
          where category_id = 2)
where category_id = 2

2 个答案:

答案 0 :(得分:2)

这是你要找的吗?

UPDATE YourTable
SET symbol = UPPER(LEFT(name,3))

答案 1 :(得分:1)

您可以使用这样的查询来计算符号的随机值:

SELECT
  id,
  name,
  UPPER(CONCAT(
    LEFT(name,1),
    SUBSTRING(name, FLOOR(r1), 1),
    SUBSTRING(name, FLOOR(FLOOR(r1) + rand()*(LENGTH(name) - r1 DIV 1) + 1), 1))) symbol
FROM (
  SELECT
    id,
    name,
    case when LENGTH(name)<=3 THEN 2 ELSE rand()*(
    LENGTH(name)-2)+2 END r1
  FROM
    categories
  ) s;

这可能是你的UPDATE查询:

UPDATE
  categories INNER JOIN (
    SELECT
      id,
      name,
      UPPER(CONCAT(
        LEFT(name,1),
        SUBSTRING(name, FLOOR(r1), 1),
        SUBSTRING(name, FLOOR(FLOOR(r1) + rand()*(LENGTH(name) - r1 DIV 1) + 1), 1))) symbol
    FROM (
      SELECT
        id,
        name,
        case when LENGTH(name)<=3 THEN 2 ELSE rand()*(
        LENGTH(name)-2)+2 END r1
      FROM
        categories
      ) s
  ) symb
  ON categories.id=symb.id
SET
  categories.symbol = symb.symbol

请参阅小提琴here