【问题标题】: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:根据列中的值和 MS SQL Server 中另一列中的至少 4 个值选择列?
【发布时间】:2021-09-13 15:34:10
【问题描述】:

我在 MS SQL Server 中有如下表:

title name1 name2
bigpay Merk Simon AL RuT PHU RU
payment Neville Ann ARG
cash 11 Bravo John Garry Owen A CD
burger Tomas Per Lucky Bank

我只需要选择以下行:

  1. 在“标题”列中是阶段“支付”或“任何配置中的现金”
  2. 在“name2”列中至少有 4 个值(该列中有 4 个或更多值)

所以,我需要如下结果:

title name1 name2
bigpay Merk Simon AL RuT PHU RU
cash 11 Bravo John Garry Owen A CD

因为只有这两行符合要求:标题中的“pay”或“cash”以及“name2”列中至少 4 个值

【问题讨论】:

  • “现金11”如何满足您的条件? (提示:它没有。)
  • name2 列值“Garry Owen”没有 4 个标记。
  • 是的,你是对的,我改变了它,现在是 Garry Owen A CD 所以 4 个值
  • 提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表加上 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上面#1 中的样本数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。全部在问题内,没有图片。

标签: sql sql-server tsql


【解决方案1】:

你可以计算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 '% % % %';

也就是说,它至少有三个空格。

Here 是一个 dbfiddle,表明两者都有效。

【讨论】:

  • 我有错误:'trim' 不是可识别的内置函数名称。如果我使用第一个解决方案
  • 等无法正常工作我的值只有 2 个值
  • @gato 。 . .无论如何,你不应该需要修剪。你应该设置一个 dbfiddle.
【解决方案2】:

自 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-30
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    相关资源
    最近更新 更多