【问题标题】:How to use SQL CONCAT/SUBSTR?如何使用 SQL CONCAT/SUBSTR?
【发布时间】:2015-04-19 10:39:53
【问题描述】:

我正在尝试为营销表中的每个人创建一个用户名。 我想要一个将新用户名插入用户名列的更新语句。

我想取名字的第一个字母,加入姓氏的前 5 个字母,并将其保存到营销表的用户名列中。我也需要以某种方式将其放入程序中。

这是我的代码:

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

但是,我遇到了似乎无法修复的错误,例如名字和姓氏是无效的标识符。任何帮助在这里表示赞赏。

【问题讨论】:

  • 当你有用户Paul JonesPeter Jones时你会怎么做?

标签: sql oracle concat substr


【解决方案1】:
update username
set username= (select concat(left(firstname,1),left(surname,5))
                  from marketing
                  WHERE marketing_id = 10001)
WHERE marketing_id = 10001;

【讨论】:

  • 更新表营销还是更新营销?正如它所说的缺少表达式:/
  • 它不起作用,仍然缺少表达式 UPDATE username SET username = SELECT CONCAT(LEFT(firstname,1),LEFT(surname,5)) FROM marketing WHERE marketing_id = 10001;
  • 试试上面更新的查询。在以前的 pranthesis 中丢失了,有些地方 cond'n...对不起
  • 除了错误的表名外,您在子查询中还有一个额外的分号,如果它正在更新同一个表,则不需要子查询,更重要的是Oracle没有@987654322 @函数。
【解决方案2】:

您似乎混淆了 concat 函数、substr 函数和连接运算符 (||)。您没有使用substr 来获取名字的第一个字符,并且要重新限制两者的长度,您需要提供both the starting position and the substring length

您还引用了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.

【讨论】:

  • 非常感谢!它终于起作用了,我明白我哪里出错了。
  • 我正在尝试将其放入一个过程中,但是当我尝试执行它时出现错误,说 SQL 语句无效,有什么建议吗?创建或替换过程 proc_create_username(vn_marketing_id marketing.marketing_id%TYPE) 开始更新营销 SET 用户名 = SUBSTR(firstname, 1, 1) || SUBSTR(姓氏, 1, 5) WHERE marketing_id = vn_marketing_id;结束 proc_create_username; / 执行 proc_create_username(10002); '
  • @ChantelleL - 如果格式正确,并且您的客户允许您运行多个语句,那么这是有效的。您是将这两个命令作为单个语句、单独的语句还是作为脚本运行?是否正在创建程序?您使用的是哪个客户端 - 它是否理解 execute
  • @OP,这确实是一个完整的答案。您应该将其标记为已回答。
  • 程序正在创建,但是当我运行执行语句时,我得到:ORA-00900: invalid SQL statement
【解决方案3】:

m.name 中的 m 需要已定义,但缺少。 CONCAT(MySQL?)应该使用字符串,除了字符串之外,您还传递了一个数字(1)。您的描述提到了两个子字符串,该语句只有一个,以SUBSTR 的出现次数衡量。如果您的 SQL 方言支持连接运算符,则将看不到您希望它看到的内容(两个 SUBSTRings)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 2020-06-05
    相关资源
    最近更新 更多