[英]MS SQL Server: Select of columns based on values in column and at least 4 values in another column in MS SQL Server?
我在 MS SQL Server 中有如下表:
标题 | 姓名1 | 姓名2 |
---|---|---|
支付宝 | 默克·西蒙 | 阿尔茹富茹 |
支付 | 内维尔·安 | ARG |
现金 11 | 布拉沃约翰 | 加里欧文一张CD |
汉堡包 | 托马斯·佩尔 | 幸运银行 |
我只需要选择这些行,其中:
所以,我需要如下结果:
标题 | 姓名1 | 姓名2 |
---|---|---|
支付宝 | 默克·西蒙 | 阿尔茹富茹 |
现金 11 | 布拉沃约翰 | 加里欧文一张CD |
因为只有这两行符合要求:标题中有“pay”或“cash”,“name2”列中至少有 4 个值
假设一个空格是分隔符,您可以计算name2
的名称:
select t.*
from t
where (title like '%pay%' or title like '%cash%') and
(1 +
len(name2) - len(replace(name2, ' ', ''))
) >= 4;
或者,因为这些都在一列中,您可以使用like
:
select t.*
from t
where (title like '%pay%' or title like '%cash%') and
name2 like '% % % %';
也就是说,它至少有三个空格。
这是一个 db<>fiddle 显示两者都有效。
自 SQL Server 2016 兼容级别 130 及更高版本起,string_split 函数可用于使用分隔符分隔单词。 如果分隔符使用空格,则 where 子句过滤器可以消除返回的额外空格(空词)。 由于 string_split 为每个单词拆分创建一个新行,因此可以对原始输出进行分组,并计算单词数。 have 子句可用于仅返回高于特定数字的计数。 如果我们不关心看到字数列,那么可以使用 CTE 来避免选择它。
例如:
DECLARE @temp TABLE (title varchar(20), name1 varchar(20), name2 varchar(100));
INSERT INTO @temp VALUES
('bigpay', 'Merk Simon', 'AL RuT PHU RU')
,('payment', 'Neville Ann' ,'ARG')
,('cash 11', 'Bravo John', 'Garry Owen A CD')
,('burger', 'Tomas Per', 'Lucky Bank');
WITH CTE AS(
SELECT title, name1, name2, COUNT(*) as [words]
FROM @temp
CROSS APPLY STRING_SPLIT(name2, ' ') AS d2
Where value <> '' --eliminate extra spaces
AND (title LIKE '%pay%' OR title LIKE '%cash%')
GROUP BY title, name1, name2
HAVING COUNT(*) >= 4
)
SELECT title, name1, name2 FROM CTE;
产生输出:
title name1 name2
-------------------- -------------------- ------------------------------
bigpay Merk Simon AL RuT PHU RU
cash 11 Bravo John Garry Owen A CD
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.