试图在 Oracle SQL 中将 FULL_NAME 分成 FIRST_NAME 和 LAST_NAME,但它没有显示表本身的任何更改

Posted

技术标签:

【中文标题】试图在 Oracle SQL 中将 FULL_NAME 分成 FIRST_NAME 和 LAST_NAME,但它没有显示表本身的任何更改【英文标题】:Trying to separate a FULL_NAME into FIRST_NAME and LAST_NAME in Oracle SQL, but it does not show any changes on the table itself 【发布时间】:2021-04-10 03:06:15 【问题描述】:

此代码应该分隔全名,它确实如此。这段代码工作正常,除了它没有将数据添加到表中。

SELECT FULL_NAME
SUBSTR(FULL_NAME, 1, INSTR(FULL_NAME, ' ', 1, 1)-1) as FIRST_NAME,
SUBSTR(FULL_NAME, INSTR(FULL_NAME, ' ', -1)+1) as LAST_NAME
from customers;

此代码运行类似,但同样不会填充表格。

ALTER TABLE CUSTOMERS;

SELECT
    substr("A1"."FULL_NAME", 1, instr("A1"."FULL_NAME", ' ', 1, 1) - 1)                 "FIRST_NAME",
    substr("A1"."FULL_NAME", instr("A1"."FULL_NAME", ' ',(- 1)) + 1)                    "LAST_NAME"
FROM
    "XXXX"."CUSTOMERS" "A1";

This is what my query result is, it shows that everything is how it should be.

This is what my table looks like but as you can see, the last two columns do not have any data.

我的目标是能够删除 FULL_NAME 列,但我需要先将这两个拆分,我不确定它为什么不起作用。任何帮助表示赞赏。

【问题讨论】:

我对此有点陌生,如果您知道可以帮助我的方法,我将不胜感激。这只是在测试台上。 我想我需要一个更新查询,但我不确定语法或如何去做。 【参考方案1】:

SELECT 语句仅显示数据。它不会改变它。 ALTER TABLE 是一个 DDL 命令,它实际上会改变表的结构(比如添加一列),但你还没有告诉它要做什么;它不会更改数据。使用UPDATE 更改数据值:

UPDATE CUSTOMERS SET
    FIRST_NAME = SUBSTR(FULL_NAME, 1, INSTR(FULL_NAME, ' ', 1, 1)-1),
    LAST_NAME = SUBSTR(FULL_NAME, INSTR(FULL_NAME, ' ', -1)+1);
COMMIT;

【讨论】:

如果您不介意快速引导我了解更新查询的结构,我将不胜感激。我可以看到它,但你能解释一下为什么会这样吗?我在网上看到的一些示例末尾有一个“位置”而不是提交。对这种差异的解释会有所帮助。 @Jr_23 where 子句将过滤您应用更新的行。您可能只想更新一个客户,或使用其他过滤条件,而不是更新所有客户。 commit 保存更改。 感谢您的澄清,它很有见地。【参考方案2】:

您可以使用生成的列:

ALTER TABLE CUSTOMERS
    ADD FIRST_NAME AS substr("FULL_NAME", 1, instr("FULL_NAME", ' ', 1, 1) - 1);

ALTER TABLE CUSTOMERS
    ADD LAST_NAME AS  substr("FULL_NAME", instr("FULL_NAME", ' ',(- 1)) + 1) ;

这些是在引用时计算的,因此这些值始终是最新的。不需要UPDATE

注意:我强烈建议您不要在列名中使用双引号。不需要它们。

Here 是一个 dbfiddle。

【讨论】:

感谢您的帮助,每个人都提供了很多信息。我想知道在您设置专栏时是否可以这样做,也谢谢您。

以上是关于试图在 Oracle SQL 中将 FULL_NAME 分成 FIRST_NAME 和 LAST_NAME,但它没有显示表本身的任何更改的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 的触发器中将日期设置为该周的星期一

在 oracle apex 中将 sql 查询重写为 pl/sql

在 Oracle SQL 中将数据透视表转换为平面表

在oracle sql中将字符串行连接到最大长度

在 PL/SQL Oracle 中将 FOR 语句转换为 FORALL

在 Oracle SQL 中将纪元时间转换为正常的日期时间格式