繁体   English   中英

MS SQL Server:根据列中的值和 MS SQL Server 中另一列中的至少 4 个值选择列?

[英]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. 在“title”栏中是“pay”或“cash in any configuration”阶段
  2. 在“name2”列中至少有 4 个值(该列中有 4 个或更多值)

所以,我需要如下结果:

标题 姓名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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM