【问题标题】:How to replace just last character?如何只替换最后一个字符?
【发布时间】:2015-11-20 13:18:49
【问题描述】:

这是我的桌子:

// table
+----+--------+
| id | number |
+----+--------+
| 1  | 123    |
| 2  | 123.   |
| 3  | 12.3   |
+----+--------+

我想要这个:

// newtable
+----+--------+
| id | number |
+----+--------+
| 1  | 123    |
| 2  | 123    |
| 3  | 12.3   |
+----+--------+

我该怎么做?

我可以这样做:(但我正在寻找更快更好的方法)

// Not tested, But I think this works!
SELECT 
  id, 
  IF(RIGHT(number,1) == '.', REPLACE(number, '.', ''), number)
FROM table
// also I can use CAST(number as unsigned) instead of REPLACE(number, '.', '')

嗯,有没有更好的解决方案? (没有IF-statement)

【问题讨论】:

  • 你是说名为number的列不是使用数字类型存储的吗?这似乎是第一个问题。
  • 首先:你想达到什么目的?您是否想替换数据库中以点字符结尾的值?你只是想改变数据库的输出吗?
  • @GordonLinoff number 具有 int(11) 类型。但是我在我的查询ROUND(number/1000,1) 中使用了类似的东西,然后. (point) 会出现......我也使用了SUBSTR(),然后有时我最后得到一个.那个号码,现在我想删除它。
  • @HerrSerker 我想要做的是检测一个更好的方法来做this。其实我想消除那个中间IF-statement。
  • 也许 ypu 应该在输出中而不是在业务逻辑中解决这个问题?您从什么语言/框架查询?

标签: mysql replace


【解决方案1】:
SELECT id, CONVERT(number, DECIMAL(10,6)) FROM test

【讨论】:

  • 您能否为您的答案添加一些解释? DECIMAL(10,6) 是什么?
  • DECIMAL(10,6) 表示该数字有 10 位数字,其中 4 个在定点之前,6 个在定点之后
  • 输出总是这样 'X.yyyyyy' X 可以是 0 或更高,但 yyyyyy 总是 6 ,例如。 '100.000000' 表示整数 100 或 '0.666667' 表示 2/3
【解决方案2】:

如果存在则删除最后一个对应的字符

SELECT id, TRIM(TRAILING '.' FROM number) FROM test

【讨论】:

  • 为您的代码添加解释总是一件好事。此外,虽然这不是被禁止的,但如果您在同一答案中提供可能的解决方案会更好。谢谢!
【解决方案3】:

如果要更改表中的数据,请使用它

mysql> CREATE TABLE test(
    -> id INT(1),
    -> number VARCHAR(5)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO test
    -> VALUES(1, '123'),
    -> (2, '123.'),
    -> (3, '12.3');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM test;
+------+--------+
| id   | number |
+------+--------+
|    1 | 123    |
|    2 | 123.   |
|    3 | 12.3   |
+------+--------+
3 rows in set (0.00 sec)

mysql> UPDATE test
    -> SET number=REPLACE(number, '.', '')
    -> WHERE RIGHT(number,1) = '.';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM test;
+------+--------+
| id   | number |
+------+--------+
|    1 | 123    |
|    2 | 123    |
|    3 | 12.3   |
+------+--------+
3 rows in set (0.00 sec)

如果您只想以这种形式获取数据,请使用它

mysql> DROP TABLE IF EXISTS test;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE test(
    ->   id INT(1),
    ->   number VARCHAR(5)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO test VALUES
    ->   (1, '123'),
    ->   (2, '123.'),
    ->   (3, '12.3')
    -> ;
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM test;
+------+--------+
| id   | number |
+------+--------+
|    1 | 123    |
|    2 | 123.   |
|    3 | 12.3   |
+------+--------+
3 rows in set (0.00 sec)

mysql> SELECT
    ->   id,
    ->   CASE
    ->     WHEN RIGHT(number,1) = '.' THEN floor(number)
    ->     ELSE number
    ->   END AS number
    -> from test;
+------+--------+
| id   | number |
+------+--------+
|    1 | 123    |
|    2 | 123    |
|    3 | 12.3   |
+------+--------+
3 rows in set (0.00 sec)

【讨论】:

  • 您的解决方案很好。但实际上这不是我想要的。 +1
  • 您不想在数据库中更改它?
  • 好吧抱歉我第一次弄错了,我试试别的
  • 我编辑了答案,我不认为这也是你需要的
猜你喜欢
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多