Add a Column that Represents a Concatenation of Two Other Varchar Columns
我有一个Employees表,我想添加第三列,作为名为"fullname"的名字和姓氏的串联值。如何在不丢失前两列中任何一列的任何数据的情况下完成此操作?
- 第二张桌子在哪里?如果您只是连接一个表中的两列,为什么不将其添加为另一列呢?
- 是否有充分的理由添加新列?您可以即时生成连接字符串。
- 它只有一个表,但是合并了一个新列。
- @Stampinstephie你最初在你的问题中有几个拼写错误,你在哪里说"表"而不是"列",这就是评论的来源。不过,我编辑了这个问题,所以现在已经解决了。
- 谢谢马修!这是漫长的一天
- 请注意,@shree.pat18中的"动态生成连接字符串"是首选方法,因为这样您的数据就不会过时。如果你现在写一次,有人在你的数据库中更改了名字,那么你的全名就会过期。另外,你在复制数据——这是你不应该做的。通过"即时"确定结果,您基本上只是引用基础数据,因此您只保留一份主数据副本。这样,如果它得到更新,你就得到了更新。
快速前言:这个答案是基于这个问题与SQL Server相关的最初不正确的标签。我不再知道它在OracleSQL开发人员上的有效性。
1
| ALTER TABLE Employees ADD FullName AS (FirstName + ' ' + LastName) |
尽管在实践中,我建议你在你的SELECT上做这个手术。这有点像个人偏好,但我倾向于认为在您的最终查询中做一些事情比存储额外的计算列更干净、更可读、更易于维护。
编辑:
这最终被发现作为答案,并被OP列为对这篇文章的评论。以下是Oracle SQL数据库的适当语法。
1
| ALTER TABLE emps MODIFY (FULL_NAME VARCHAR2(50) GENERATED ALWAYS AS (first_name || ' ' || last_name) VIRTUAL); |
号
- 好的,我这样做了,看起来它添加了它,但是当我选择显示它时,我得到了无效的数字错误,从命令中的第2行开始-从EMPS错误报告中选择全名-SQL错误:ORA-01722:无效的数字01722。00000-"无效数字"*原因:*操作:
- @很有趣。我甚至不认识那个错误的语法…您使用的是什么版本的SQL Server?
- 其SQL开发人员4.0.2.15
- 这听起来像是Oracle服务器,而不是您标记的Microsoft SQL Server。我不熟悉OracleSQL的语法。使用类似的列进行选择时会发生什么情况?SELECT FirstName + ' ' + LastName FROM EMPS。
- 我用"全名"得到了正确的输出。该列名为名字
- 对不起,我贴错了东西,新来的。其Oracle SQL开发人员
- @Stampinstephie没问题。我也帮你修好了标签。我看到你把杰基的回答标为接受了,那对你有用吗?
- 不,对不起,没有。我没有标记。谢谢你的帮助。
- 等等,你还没找到解决方案?只是说清楚?如果没有,我将尝试与我在答案中提出的语法相同的语法,但使用双管运算符而不是加号。似乎这就是OracleSQL用作连接运算符的原因。
- 我试过了,但没用。还没有解决方案。我可以选择emps.first_name___emps.last_name作为emps的全名,并获得正确的列输出,但不创建新列。当我尝试这样做时,从EMPS订单中按姓氏选择员工ID、全名、薪资、部门ID;它显示为一列,但没有数据。我还做了一个修改表,将它添加为一列。
- @Stampinstephie我会看一下文档。不过,我还没有在Oracle中找到对计算列的单一引用。这有点奇怪。
- 出于好奇,与SELECT中的显式列相比,您是否希望将此列作为计算列来执行?
- 啊哈!(我想)。根据这个,语法是...FullName COMPUTED BY first_name||' '||last_name。
- 嗨,马修。我得到了一个虚拟列的解决方案,我需要这样做:修改表EMPS修改(完整的varchar2(50)生成始终为(first_name_'last_name)virtual);再次感谢您的帮助!
如果从数据库中选择时一直需要全名列,则可以在创建表Employee时创建计算列。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| CREATE TABLE Employee
(
FirstName VARCHAR(20),
LastName VARCHAR(20),
FullName AS CONCAT(FirstName,' ',LastName)
)
INSERT INTO Employee VALUES ('Rocky','Jeo')
SELECT * FROM Employee
Output:
FirstName LastName FullName
Rocky Jeo Rocky Jeo |
这取决于您的目的,您是否真的需要向数据库中添加一个新列,或者您只需要根据需要查询出"全名"。
要动态查看,只需运行查询
江户十一〔一〕号
除此之外,还可以创建一个简单的存储过程来存储它。
(对于单个结果,在Where条件下使用等于)
1 2 3
| SELECT *
FROM TABLE_NAME
WHERE (Column1+Column2) IN (11361+280,11365+250) |
。