SQL İmlecindeki While ifadesi null değerler getiriyor

0

Soru

Kimlik, telefon numarası, kişi adı vb.Gibi tipik değerlere sahip bir tablom var. Bu tabloda, bir kişinin birden fazla telefon numarası varsa, o kişi birden çok kez görünecektir, her yineleme o kişiye karşılık gelen farklı bir telefon numarasına sahip olacaktır.

Amacım, bir kişinin sahip olduğu tüm farklı telefonları, her biri bir', 'ile ayrılmış yeni bir tabloda tek bir telefon değerine ekleyecek bir imleç yazmaktır. Bu şekilde, her kişi tabloda yalnızca bir kez görünür, ancak telefon numaraları değeri, o kişinin sahip olduğu telefon numarasını', 'ile ayırır.

Böyle bir şeyle geldim.:

Burada, kişi bilgilerinin eklenmesi gereken "normalleştirilmiş" tabloyu oluşturuyorum:

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

Bu, birden çok kez tekrarlanan kişi kimliğini seçmek için geçici bir tablodur, yani birden fazla telefon numarası vardır (Telefonos_General, verileri aldığım tablodur).

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

Burada imleçte kullanılan değişkenleri bildiriyorum:

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

Ardından imlecin kendisini bildirin:

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

İmleci başlat:

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

(@Telefonos+', ' + @Prev_Telefono) olması gerektiğinde @Prev_Telefono null olarak döndüren while döngüsü budur.

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

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

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

Burada sadece imleci kapatıyorum:

END
CLOSE cursor_telefonos
DEALLOCATE cursor_telefonos

Birisi while döngüsünün neden o kişinin telefon numaralarının bir listesini eklemesi gerektiğinde yeni telefonlar tablosuna null eklediğini biliyor mu?

İlginiz için çok teşekkürler!!

database database-cursor sql
2021-11-24 02:51:22
1

En iyi cevabı

0

Eğer seni doğru anladıysam, o zaman aşağıda olası sebep olabilir .

1-Birden fazla telefon numarasına sahip kişi kimliğini bulduğunuz ve ardından Telefonos_General ile katıldıktan sonra o kişi kimliği için farklı telefon numaralarını aldığınız kodda. (Burada, joın'ler ilgilenecek olsa da, kişi kimliği ile ilgili verilerinizi kısaltmalısınız, ancak lütfen doğrulayın)

2-Telefonos'a değer atadığınız değişken bildirim kodunda (lütfen else ifadesini doğrulayın).

Not - Ayrıca kullanım durumunuz için virgül ayırıcılı tüm telefon numaralarını ekleyecek Dize Toplama işlevlerini kullanabilirsiniz. (Daha önce bu işlevi Postgress'te aynı kullanım durumu için kullanmıştım, ancak mssql'de de alacağınızdan eminim.)

Aşağıdaki gibi verileriniz olduğunu varsayalım

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

Aşağıdaki sorguyu kullanabilirsiniz

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

Bu size şunları verecektir:

name    merge_date
 A    2019-03-01,2021-03-01
 B    2022-03-01,2020-03-01
 C    2023-03-01
2021-11-24 04:51:29

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................