sql - SQL 连接列值并存储在额外的列中
问题描述
我正在使用 SQL Server 2019 (v15.0.2080.9),我有一个简单的任务,但不知何故我无法解决它......
我有一个包含名字和姓氏列的表的小数据库
CREATE TABLE [dbo].[person]
(
[first_name] [nchar](200) NULL,
[last_name] [nchar](200) NULL,
[display_name] [nchar](400) NULL
) ON [PRIMARY]
GO
我想在第三列中存储名字的组合和一个额外的空格(是的,我真的必须这样做......)。
所以我想我可能会使用 CONCAT 函数
UPDATE [dbo].[person]
SET display_name = CONCAT(first_name, ' ', last_name)
但是我的display_name
专栏只显示了我的名字……那么我的 SQL 出了什么问题?
亲切的问候斯文
解决方案
您的方法应该有效并且确实有效。但问题是数据类型nchar()
不是nvarchar()
. 这意味着它们用空格填充,并且姓氏从字符串中的位置 201 开始。
只需修复数据类型。
此外,我建议您使用计算列:
alter table person add display_name as (concat(first_name, ' ', last_name));
这确保了display_name
始终是最新的——即使名称发生变化。
这是一个 db<>fiddle。
注意: char()
并且nchar()
几乎从不合适。一个例外是当您有固定长度的字符串时,例如州或国家/地区的缩写或帐户代码。在几乎所有情况下,您都需要varchar()
or nvarchar()
。
推荐阅读
- c# - 局部变量“person”在声明之前不能使用
- data-structures - 深度嵌套在结构数组中的元胞数组的访问值
- visual-studio - Visual Studio 2019 调试导致鼠标延迟
- javascript - 输入文本后编写一个javascript代码在文本框字段内按空格?
- python - 按组透视并合并到 Pandas 数据框中
- python - Selenium:如何单击显示按钮,抓取 href,然后再次单击显示按钮?
- swift - 子类是否从 Swift 中的超类扩展继承便利初始化程序?
- singleton - Blazor 全局单例对象 - 使用依赖注入?
- shell - 解析 ifconfig
- matlab - 在 MATLAB 中绘制分段函数