如何使用SQL CONCAT/SUBSTR?

4

我正在尝试为营销表中的每个人创建一个用户名。

我想要一个更新语句,将新的用户名插入到用户名列中。

我想要将名字的第一个字母与姓氏的前5个字母结合起来,保存到营销表的用户名列中。我需要将其放在某个过程中。

以下是我的代码:

SELECT CONCAT(m.firstname, 1)||SUBSTR(m.surname, 5)
INTO username
FROM marketing
WHERE marketing_id = 10001;

然而,我遇到了一些错误,似乎无法解决,例如名字和姓氏是无效的标识符。在此需要任何帮助。


1
当你有用户 Paul JonesPeter Jones 时,你会怎么做? - David Faber
3个回答

4
您似乎混淆了concat函数、substr函数和连接运算符(||)。您没有使用substr函数来获取名字的第一个字符,要限制长度,您需要提供起始位置和子字符串长度

您还在引用m.firstname而没有将m定义为表名的别名;虽然只有一张表,但实际上不需要别名,如果使用别名,请始终如一地使用。

要获取名字的第一个字母和姓氏的前五个字母,您可以使用:

SELECT SUBSTR(m.firstname, 1, 1) || SUBSTR(m.surname, 1, 5)
FROM marketing m
WHERE m.marketing_id = 10001;

或者

SELECT CONCAT(SUBSTR(m.firstname, 1, 1), SUBSTR(m.surname, 1, 5))
FROM marketing m
WHERE m.marketing_id = 10001;

如果你要更新同一张表中的列,而不是使用PL/SQL into子句,你需要使用更新而不是选择:

UPDATE marketing
SET username = SUBSTR(firstname, 1, 1) || SUBSTR(surname, 1, 5)
WHERE marketing_id = 10001;

SQL Fiddle demo.


非常感谢!终于可以工作了,我也明白自己错在哪里了。 - ChantelleL
我正在尝试将这个放入一个过程中,但是当我尝试执行它时,出现了无效的SQL语句错误,请问有什么建议吗?CREATE OR REPLACE PROCEDURE proc_create_username(vn_marketing_id marketing.marketing_id%TYPE) ISBEGIN UPDATE marketing SET username = SUBSTR(firstname, 1, 1) || SUBSTR(surname, 1, 5) WHERE marketing_id = vn_marketing_id;END proc_create_username; / EXECUTE proc_create_username(10002); ' - ChantelleL
@ChantelleL - 如果格式正确,且您的客户端允许您运行多个语句,则该语句是有效的。您是将这两个命令作为单个语句、分开的语句还是作为脚本运行的?存储过程是否已创建?您使用的客户端是哪个 - 它是否理解“execute”? - Alex Poole
@OP,这确实是一个完整的答案。您应该将其标记为已回答。 - Lalit Kumar B
该过程正在创建中,但当我运行执行语句时,出现了ORA-00900:无效的SQL语句。 - ChantelleL
@ChantelleL - 也许你的客户不理解execute,可以尝试使用显式匿名块,例如 begin proc_create_username(10002); end;。正如 Lalit 暗示的那样,这实际上已经涉及到了另一个问题。 - Alex Poole

1
"

m.name中的m需要被定义,这个缺失了。 CONCAT(MySQL?)应该使用字符串,你除了一个字符串之外还传递了一个数字(1)。你的描述提到了两个子字符串,但语句只有一个,通过SUBSTR出现次数来衡量。如果你的SQL方言支持连接运算符,那么它将无法看到你想要的内容(两个SUBSTR字符串)。

"

-1
update username
set username= (select concat(left(firstname,1),left(surname,5))
                  from marketing
                  WHERE marketing_id = 10001)
WHERE marketing_id = 10001;

更新表格marketing还是更新marketing?因为它显示缺少表达式 :/ - ChantelleL
无法工作,仍然缺少表达式。 更新用户名 SET username = SELECT CONCAT(LEFT(firstname,1),LEFT(surname,5)) FROM marketing WHERE marketing_id = 10001; - ChantelleL
尝试使用上述已更新的查询。在之前的括号中缺失了一些内容,以及某些地方的条件...抱歉。 - koushik veldanda
1
除了表名错误外,子查询中还有一个多余的分号。如果更新的是同一张表,则不需要子查询。更重要的是,Oracle没有left()函数。 - Alex Poole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接