es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Resultado distinto por toda la tabla al utilizar CROSS APPLY en JSON y ORDER BY con CASE.

Necesito ordenar mi resultado por valor de un diccionario almacenado como JSON en mi tabla que es igual a un parámetro.
Para obtenerlo, estoy utilizando un caso en mi ordenamiento para verificar si el valor del diccionario coincide con el parámetro.
Después de ordenar la tabla, necesito eliminar los resultados duplicados, sin embargo, estoy obteniendo un error y no he podido resolverlo.

Aquí está mi consulta:

declare @FilteredItemIDs -> tabla temporal que filtra mis elementos

declare @CurrentGroupID como int

seleccionar distinct item.*
de Items as items
    outer apply openjson(json_query(Data, '$.itemOrderPerGroup'), '$') as X
donde items.ItemID en (select ItemID de @FilteredItemIDs )
order by caso
    cuando @CurrentGroupID!= 0 y (JSON_VALUE(X.[Value], '$.Key') = @CurrentGroupID) entonces 1
    sino 2 final,
    CONVERTIR(int, JSON_VALUE(X.[Value], '$.Value'))
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con la consulta es que después de aplicar la cláusula order by, nos quedan duplicados en nuestro conjunto de resultados. Para eliminar los duplicados, estamos utilizando la palabra clave distinct.

    Sin embargo, la palabra clave distinct no se puede aplicar a un conjunto de resultados que incluye tipos de datos LOB (Large Object) como JSON. Por lo tanto, necesitamos convertir los datos de JSON en un formato de cadena antes de aplicar la palabra clave distinct.

    Aquí hay una versión actualizada de la consulta que debería funcionar:

    declare @FilteredItemIDs -> tabla temporal que filtra mis elementos
    
    declare @CurrentGroupID as int
    
    select distinct CONVERT(nvarchar(MAX), item.*)
    from Items as items
        outer apply openjson(json_query(Data, '$.itemOrderPerGroup'), '$') as X
    where items.ItemID in (select ItemID from @FilteredItemIDs )
    order by case
        when @CurrentGroupID!= 0 and (JSON_VALUE(X.[Value], '$.Key') = @CurrentGroupID) then 1
        else 2 end,
        CONVERT(int, JSON_VALUE(X.[Value], '$.Value'))
    

    Tenga en cuenta que ahora estamos convirtiendo toda la fila de elementos en una cadena utilizando la función CONVERT, y también estamos aplicando la función CONVERT al valor de JSON que se ordena. Esto debería permitir que se aplique la palabra clave distinct sin problemas.

Comments are closed.