在结果集中仅基于1列和2列的基于定界符的单独值?

时间:2018-07-06 17:24:43

标签: sql sql-server tsql

我以以下方式在[表格]中存储了数据:

WEEK   | Number | Restrict
2018-1 | 1      | 101;102;103
2018-2 | 2      | 101;102;104;105
...

我希望能够选择所选星期的[Number]和[Restrict]结果,然后将[Restrict]分成临时表中的各个结果。

根据到目前为止的发现,根据本文,我可以使用以下内容将[Restrict]列分为几行:Break down a delimited string into a temporary table

USE [database];

DECLARE @Week nvarchar(50);
DECLARE @Restrict VARCHAR(MAX);

SET @Week = '2018-1';
SET @Restrict = (SELECT [Restrict] FROM [dbo].[Table] WHERE [Week] = @Week);

DECLARE @ExclusionData TABLE (
    [data] nvarchar(50) NULL
    )

INSERT INTO @ExclusionData(data)
SELECT data
FROM dbo.Split(@Restrict, ';') s


SELECT * FROM @ExclusionData

我还如何返回每个“限制”值旁边的“数字”列?

3 个答案:

答案 0 :(得分:1)

我认为这将满足您的需求。我很确定有更好的方法,可以考虑一下,但是应该这样做:

USE [database];

DECLARE @Week nvarchar(50);
DECLARE @Restrict VARCHAR(MAX);
DECLARE @Number INT

SET @Week = '2018-1';

-- this is assuming you can only have one row returned
SELECT @Number = Number,
@Restrict = [Restrict] 
FROM [dbo].[Table] 
WHERE [Week] = @Week

DECLARE @ExclusionData TABLE (
    [data] nvarchar(50) NULL
)

INSERT INTO @ExclusionData(data)
SELECT data
FROM dbo.Split(@Restrict, ';') s


SELECT @Number, * FROM @ExclusionData

//已更新了可能的解决方案,但未经过测试如果可以提供表结构和测试数据的数据插入脚本,我可以对此进行测试。您应该可以执行类似的操作

select t.Number, x.Data
FROM [dbo].[Table] t
cross apply (select data FROM dbo.Split(t.[Restrict],';') ) x
WHERE [Week] = @Week

答案 1 :(得分:0)

您可以使用cross apply

SELECT t1.[WEEK], t1.[Number], t2.Data as Restrict
FROM table t1 CROSS APPLY 
     dbo.Split(t1.Restrict, ';') t2
WHERE . . .;

答案 2 :(得分:0)

对于您的项目,我的解决方案可能会过高,但是... 从技术上讲,正确的方法是创建另一个具有返回当前表键的表。表中永远不能包含数组。
您当前的表将丢失Restrict列,并将用作主表。 第二个表将通过外键指向主表。根据您的发言,这看起来与主表(周,数字)相同。它还将具有“限制”列,但只有一个值。
因此主表记录可能是2018-1 | 1,辅助表的记录可能是 2018-1 | 1 | 101,2018-1 | 1 | 102,2018-1 | 1 | 103 ...等。
您可以根据需要在主表上创建一个主键,然后将其用作第二表的外键。

使用此解决方案,您可以计算您拥有的102条记录等,而无需重新解析表。您也可以在该字段上建立索引。您可以更轻松地将子记录添加/删除到父记录中。