当前位置: 首页 > 面试题库 >

拆分列表时确定第n个项目?

许子平
2023-03-14
问题内容

我想ROW_NUMBER在cte中提供一个能够从具有给定索引(如array-indexer
arr[index])的序列中选择特定项目的功能。当然,“序列”是一个来自表值函数(Split)的表。

那么如何在索引不可用时创建索引呢?这是查询:

DECLARE @string VARCHAR(100); 
SET @string='field1;field2;field3;field4;field5;field6;field7'; 
DECLARE @index INT; 
SET @index = 4;

WITH cte 
     AS (SELECT item, 
                rn=Row_number() 
                     OVER( 
                       ORDER BY item) 
         FROM   dbo.Split(@string, ';')) 
SELECT TOP 1 item 
FROM   cte 
WHERE  rn = @index

Row_number() OVER(ORDER BY item) 按字母顺序排序,但实际上我想按(不可用)索引排序。

请注意,这个问题是我对这个问题的回答引起的。


问题答案:

当然,您只需要跟踪每个项目在列表中的显示位置即可。一种方法是让您的拆分函数插入一IDENTITY列。以我的回答从你引用的问题:

CREATE FUNCTION dbo.SplitStrings
(
    @List       NVARCHAR(MAX),
    @Delimiter  NVARCHAR(255)
)
RETURNS @t TABLE([Index] INT IDENTITY(1,1), Item NVARCHAR(255))
AS
BEGIN
    INSERT @t(Item) SELECT SUBSTRING(@List, Number, 
        CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)
    FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
        FROM sys.all_objects) AS n(Number)
    WHERE Number <= CONVERT(INT, LEN(@List))
        AND SUBSTRING(@Delimiter + @List, Number, 1) = @Delimiter
    ORDER BY Number OPTION (MAXDOP 1);

    RETURN;
END
GO

DECLARE @x TABLE(i INT, string NVARCHAR(4000));

INSERT @x SELECT 1, N'field1;field2;field3;field4;field5;'
UNION ALL SELECT 2, N'x;y;6;r;3;2;w;'
UNION ALL SELECT 3, N'ttt;444;rrr;333;111;444;777;888;';

SELECT x.i, s1.Item
FROM @x AS x
CROSS APPLY dbo.SplitStrings(x.string, ';') AS s1
WHERE s1.[Index] = 4;

内联替代方案,在规模上 可能稍微 友好一些:

CREATE FUNCTION dbo.SplitStrings
(
    @List       NVARCHAR(MAX),
    @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
AS
    RETURN (SELECT [Index] = ROW_NUMBER() OVER (ORDER BY Number),
        Item FROM (SELECT Number, Item = LTRIM(RTRIM(SUBSTRING(@List, Number, 
        CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)))
    FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
        FROM sys.all_objects) AS n(Number)
    WHERE Number <= CONVERT(INT, LEN(@List))
        AND SUBSTRING(@Delimiter + @List, Number, LEN(@Delimiter)) = @Delimiter
    ) AS y);
GO

当然,最终您将需要修复架构。如果此列表中的第4个元素是重要数据,则应将其单独存储。



 类似资料:
  • 我想用Java中所有可能的方法将一个列表拆分为给定数量的n个子列表。 例如,其中n=3将包括以下列表(但不是一个完整的解决方案-完成将需要更多的空间): 等 我适应了另一个类似的问题的解决方案(以所有可能的方式将列表分割成两个子列表),但它只适用于创建2个子列表的列表,我正在努力掌握如何实现灵活而不是硬编码的子列表数量。 这是我的密码: 我需要创建n个数的EGroup对象添加到,而不是硬编码的2,

  • 我有很多这样的字符串: 我想拆分这些字符串,使其如下所示: 然后,这些将被添加到数据集中并在以后进行分析。 我遇到的问题是,如果我使用以下代码: 它会将它们分裂两次;我只想在第二次出现:时将其拆分一次。 我该怎么做呢?

  • 如何使用流将Java列表拆分为Java大小为的较小列表? 在JavaScript中,我会使用函数并执行如下操作: 我试图用Java流来实现这一点,但我似乎不知道如何让它允许我使用数组列表

  • 问题内容: 如果我们在python中有一个,并且想要基于一些特殊的条件创建子列表,我们应该怎么做? 例如: 会产生: 问题答案: itertools.groupby是一种方法(通常是这样): 由于这种特殊情况,我们甚至可以作弊:

  • 本文向大家介绍在Python中拆分自定义列表,包括了在Python中拆分自定义列表的使用技巧和注意事项,需要的朋友参考一下 数据分析引发了复杂的场景,在这些场景中,数据需要整理才能移动。在这种情况下,让我们看看如何根据需要将一个大列表分成多个子列表。在本文中,我们将探讨实现这一目标的方法。 带拉链和for环 在这种方法中,我们使用列表切块从必须进行分割的位置获取元素。然后,我们使用zip和for循

  • 我有多行这样的代码,我试图将它们拆分并添加到3个不同的列表中。“~”将它们分开。 姓名~年龄~单词 姓名~年龄~单词 我用下面的代码将其拆分。 我有ArrayList年龄,ArrayList名字,ArrayList。。。。 当我进行拆分[0]时,它确实有效,并给出了名称。 但是当我做分裂[1]的时候,它会给我一个断点错误。 有什么帮助吗?你能给我推荐一个更好的方法吗?