在 SQL 中,如何合并 10 个字符长的 3 列的第一个值
In SQL, how do I coalesce the first value of 3 columns that is 10 characters long
我正在尝试从 3 个不同的 phone 数字列中仅 select 一列,我希望拥有最长 phone 数字的列(有些不有区号)。目前,我合并了 3 列,因为有些列也为空,并且优先选择单元格 phone.
例如
CREATE TABLE dbo.Persons
(
first_name VARCHAR(100) NULL
,cell_number VARCHAR(20) NULL
,home_number VARCHAR(20) NULL
,work_number VARCHAR(20) NULL
);
INSERT INTO dbo.Persons
(
first_name
,cell_number
,home_number
,work_number
)
VALUES
( 'Dave' -- first_name - varchar(100)
,'4567891' -- cell_number - varchar(20)
,'1234567891' -- home_number - varchar(20)
,NULL -- work_number - varchar(20)
)
,
( 'Ron' -- first_name - varchar(100)
,'1234567891' -- cell_number - varchar(20)
,NULL -- home_number - varchar(20)
,NULL -- work_number - varchar(20)
)
,
( 'Yitzhak' -- first_name - varchar(100)
,'123' -- cell_number - varchar(20)
,NULL -- home_number - varchar(20)
,'1234567891' -- work_number - varchar(20)
);
我尝试过的:
SELECT TOP 1
COALESCE(cell_number, home_number, work_number)
FROM Persons ORDER BY LEN(cell_number),LEN(home_number),LEN(work_number) DESC;
我宁愿只有 10 个字符长的第一个数字或 3 列中最长的数字,我只能返回一列。如果它可以保持 cell_number 的偏好,则加分,但不是必需的。
@@version : Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) 2019 年 9 月 24 日 13:48:23 版权所有 (C) 2019 Microsoft Corporation Express Edition(64 位) Windows10 企业版 10.0(内部版本 18363:)(管理程序)
您可以使用 case
表达式。但是,outer apply
比大写表达式更简单——并且更容易推广到更多 phone 数字:
select p.*, v.phone
from persons p outer apply
(select top (1) v.phone
from (values (cell_number, 1), (home_number, 2), (work_number, 2)
) v(phone, priority)
where v.phone is not null
order by len(v.phone) desc, priority
) v;
我正在尝试从 3 个不同的 phone 数字列中仅 select 一列,我希望拥有最长 phone 数字的列(有些不有区号)。目前,我合并了 3 列,因为有些列也为空,并且优先选择单元格 phone.
例如
CREATE TABLE dbo.Persons
(
first_name VARCHAR(100) NULL
,cell_number VARCHAR(20) NULL
,home_number VARCHAR(20) NULL
,work_number VARCHAR(20) NULL
);
INSERT INTO dbo.Persons
(
first_name
,cell_number
,home_number
,work_number
)
VALUES
( 'Dave' -- first_name - varchar(100)
,'4567891' -- cell_number - varchar(20)
,'1234567891' -- home_number - varchar(20)
,NULL -- work_number - varchar(20)
)
,
( 'Ron' -- first_name - varchar(100)
,'1234567891' -- cell_number - varchar(20)
,NULL -- home_number - varchar(20)
,NULL -- work_number - varchar(20)
)
,
( 'Yitzhak' -- first_name - varchar(100)
,'123' -- cell_number - varchar(20)
,NULL -- home_number - varchar(20)
,'1234567891' -- work_number - varchar(20)
);
我尝试过的:
SELECT TOP 1
COALESCE(cell_number, home_number, work_number)
FROM Persons ORDER BY LEN(cell_number),LEN(home_number),LEN(work_number) DESC;
我宁愿只有 10 个字符长的第一个数字或 3 列中最长的数字,我只能返回一列。如果它可以保持 cell_number 的偏好,则加分,但不是必需的。
@@version : Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) 2019 年 9 月 24 日 13:48:23 版权所有 (C) 2019 Microsoft Corporation Express Edition(64 位) Windows10 企业版 10.0(内部版本 18363:)(管理程序)
您可以使用 case
表达式。但是,outer apply
比大写表达式更简单——并且更容易推广到更多 phone 数字:
select p.*, v.phone
from persons p outer apply
(select top (1) v.phone
from (values (cell_number, 1), (home_number, 2), (work_number, 2)
) v(phone, priority)
where v.phone is not null
order by len(v.phone) desc, priority
) v;