如何使用同一 table 中另一列的数据更新 table 中的列?

How do I update a column from a table with data from a another column from this same table?

我有一个 table "table1" 这样的:

+------+--------------------+
| id   | barcode     | lot  |
+------+-------------+------+
| 0    | ABC-123-456 |      |
| 1    | ABC-123-654 |      |
| 2    | ABC-789-EFG |      |
| 3    | ABC-456-EFG |      |
+------+-------------+------+

我必须提取列中心的数字 "barcode",就像这个请求一样:

SELECT SUBSTR(barcode, 5, 3) AS ToExtract FROM table1;

结果:

+-----------+
| ToExtract |
+-----------+
| 123       |
| 123       |
| 789       |
| 456       |
+-----------+

并将其插入 "lot" 列。

UPDATE table1 SET Lot = SUBSTR(barcode, 5, 3) 
-- WHERE ...;

按照

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

即你的情况

UPDATE table_name
SET lot = SUBSTR(barcode, 5, 3)
WHERE condition;(if any)

许多数据库支持生成(又名 "virtual"/"computed" 列)。这允许您将列 定义为表达式 。语法是这样的:

alter table table1 add column lot varchar(3) generated always as (SUBSTR(barcode, 5, 3))

使用生成的列有几个优点:

  • 它始终是最新的。
  • 一般不占用任何space。
  • 创建 table 时没有开销(尽管查询 table 时有开销)。

我应该注意到语法在数据库之间略有不同。有些不需要类型说明。有些只使用 as 而不是 generated always as.

CREATE TABLE Table1(id INT,barcode varchar(255),lot varchar(255))
INSERT INTO Table1 VALUES (0,'ABC-123-456',NULL),(1,'ABC-123-654',NULL),(2,'ABC-789-EFG',NULL)
                   ,(3,'ABC-456-EFG',NULL)
  
UPDATE a
SET a.lot = SUBSTRING(b.barcode, 5, 3)
FROM Table1 a
INNER JOIN Table1 b ON a.id=b.id
WHERE a.lot IS NULL
id | barcode     | lot
-: | :---------- | :--
 0 | ABC-123-456 | 123
 1 | ABC-123-654 | 123
 2 | ABC-789-EFG | 789
 3 | ABC-456-EFG | 456

db<>fiddle here