反转 SQL Server 中列的内容

本文关键字:SQL Server 反转 | 更新日期: 2023-09-27 18:32:47

我最近将访问数据库数据导入到客户的SQL Server数据库中。对于名为"案例"的表之一;我将"Case_Name"列设置为"姓氏名字",其中"姓氏"和"名字"是 Access 数据库中的列。现在,客户希望"Case_Name"列改为"名字姓氏"。所以我的问题是这是否可以在 T-SQL 中很好地完成或简单地完成,或者我是否需要再次重新运行我的 c# 迁移程序或创建其他一些 c# 程序

当前格式:

Cases表:

Id         Case_Name         Case_Description
1          Bloggs Joe        Will Management
2          York Susan        Divorce CAse

希望表格如下所示:

Id         Case_Name         Case_Description
1          Joe Bloggs        Will Management
2          Susan York        Divorce CAse

反转 SQL Server 中列的内容

变体 #1

DECLARE @temp TABLE
(
      ID INT IDENTITY(1,1)
    , Case_Name NVARCHAR(50)
    , Case_Description NVARCHAR(50)
)
INSERT INTO @temp (Case_Name, Case_Description)
VALUES 
    ('Bloggs Joe', 'Will Management'),
    ('York Susan', 'Divorce CAse')
UPDATE @temp
SET Case_Name = SUBSTRING(Case_Name, CHARINDEX(' ', Case_Name), LEN(Case_Name)) + ' ' + SUBSTRING(Case_Name, 1, CHARINDEX(' ', Case_Name)) 
SELECT * FROM @temp

变体#2

DECLARE @temp TABLE
(
      ID INT IDENTITY(1,1)
    , Case_Name NVARCHAR(50)
    , Case_Description NVARCHAR(50)
)
INSERT INTO @temp (Case_Name, Case_Description)
VALUES 
    ('Bloggs Joe', 'Will Management'),
    ('York Susan', 'Divorce CAse')
CREATE TABLE dbo.temp
(
      ID INT IDENTITY(1,1) PRIMARY KEY
    , FirstName NVARCHAR(20) NOT NULL
    , LastName NVARCHAR(20) NOT NULL
    , Case_Name AS FirstName + ' ' + LastName
    , Case_Description NVARCHAR(50)
)
INSERT INTO dbo.temp (FirstName, LastName, Case_Description)
SELECT 
      SUBSTRING(Case_Name, CHARINDEX(' ', Case_Name), LEN(Case_Name)) 
    , SUBSTRING(Case_Name, 1, CHARINDEX(' ', Case_Name)) 
    , Case_Description 
FROM @temp
SELECT * FROM dbo.temp

输出

ID          FirstName            LastName             Case_Name                                 Case_Description
----------- -------------------- -------------------- ----------------------------------------- --------------------------------------------------
1            Joe                 Bloggs                Joe Bloggs                               Will Management
2            Susan               York                  Susan York                               Divorce CAse

安全的选项是再次运行迁移程序。

这避免了人们有多个姓氏或多个名字或两者兼而有之的问题。

更好的解决方案是为姓氏和名字设置单独的列。

SELECT SUBSTRING(casename, 1, CHARINDEX(' ', casename) - 1) AS [FirstName],
SUBSTRING(casename, CHARINDEX(' ', casename) + 1, LEN(casename)) AS [LastName]
这会将 2 分开一个

空格,然后您可以根据需要将它们连接在一起。

SELECT FirstName + ' ' + LastName FROM (subquery to get the split as above) as subq

正如其他人提到的,如果他们有多个名字等,那就行不通了。此外,将它们存储在单独的字段中,以使其更容易