【问题标题】:While statement in SQL Cursor bringing null valuesSQL游标中的while语句带来空值
【发布时间】:2021-11-24 02:51:22
【问题描述】:

我得到了一个包含典型值的表格,例如:身份、电话号码、人名等。在这个表格中,如果一个人有多个电话号码,该人将出现多次,每次迭代都有一个对应的不同电话号码人。

我的目标是编写一个光标,它将一个人所有不同的音素添加到一个新表中的单个音素值中,每个音素都用“,”分隔。这样每个人只会在表格中出现一次,但电话号码值将包含该人拥有的所有电话号码,并用“,”分隔。

我有这样的东西:

在这里我创建了应该插入人员信息的“规范化”表:

CREATE TABLE Telefono_General_V2 (Cedula_v2 varchar(50),Nombre_v2 varchar(50),Cantidad int, Telefono_v2 varchar(max))

这是一个用于选择重复多次的人员 ID 的临时表,这意味着它有多个电话号码(Telefonos_General 是我从中获取数据的表)。

SELECT  Cedula_v1 AS Cedula, COUNT(1) AS cantidad_repetidos
INTO #DatosRepetidosTemp
FROM Telefonos_General
GROUP BY Cedula_v1
HAVING  COUNT(1) >1

这里我声明游标中使用的变量:

DECLARE
@Cedula varchar(50),
@Cuenta int,
@Prev_Telefono varchar(max),
@Telefonos varchar(max)

然后声明游标本身:

DECLARE cursor_telefonos CURSOR FOR 
SELECT TOP (100) Cedula, cantidad_repetidos, Telefono_v1
FROM #DatosRepetidosTemp     
JOIN Telefonos_General on Cedula_v1 = Cedula
WHERE  Cedula is not null

启动光标:

OPEN cursor_telefonos  
FETCH NEXT FROM cursor_telefonos 
INTO @Cedula, @Cuenta, @Prev_Telefono
WHILE @@FETCH_STATUS = 0   
BEGIN  
    IF @Telefonos = NULL
        SET @Telefonos = @Prev_Telefono
    ELSE

这是当 @Prev_Telefono 应该是 (@Telefonos+ ', ' + @Prev_Telefono) 时返回 null 的 while 循环。

    WHILE @Cuenta != 0
    BEGIN
        SET @Telefonos = @Telefonos+ ', ' + @Prev_Telefono
        SET @Prev_Telefono = @Telefonos
        SET @Cuenta = @Cuenta - 1

    END
    INSERT INTO Telefono_General_V2 (Cedula_v2, Cantidad, Telefono_v2)
    VALUES (@Cedula, @Cuenta, @Telefonos)

    FETCH NEXT FROM cursor_telefonos INTO @Cedula, @Cuenta, @Telefonos

这里我只是关闭光标:

END
CLOSE cursor_telefonos
DEALLOCATE cursor_telefonos

有人知道为什么我的 while 循环在应该添加该人的电话号码列表时在新的电话表中插入 null 吗?

非常感谢您的关注!!

【问题讨论】:

  • 使用is null 而不是相等。您不需要在循环中读取新值吗?

标签: sql database database-cursor


【解决方案1】:

如果我理解你是正确的,那么可能的原因如下。

1- 在代码中,您可以找到具有多个电话号码的人员 ID,然后在将其与 Telefonos_General 连接后获取该特定人员 ID 的不同电话号码。 (在这里你应该缩短你的个人 ID 数据,虽然加入会处理它,但请验证它)

2- 在您为 Telefonos 赋值的变量声明代码中(请验证 else 语句)。

注意——对于您的用例,您还可以使用字符串聚合函数,该函数将使用逗号分隔符添加所有电话号码。 (我之前在 Postgress 中将这个函数用于相同的用例,但我相信你也会在 mssql 中得到它。)

假设您有如下数据

name    date1
 A    2019-03-01
 B    2020-03-01
 A    2021-03-01
 B    2022-03-01
 C    2023-03-01

您可以使用以下查询

select name,string_agg(date1,',') as merge_date from table_name group by name

这会给你:

name    merge_date
 A    2019-03-01,2021-03-01
 B    2022-03-01,2020-03-01
 C    2023-03-01

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-25
    • 2022-01-17
    • 2023-03-10
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2018-06-01
    相关资源
    最近更新 更多