Hay alguna forma de hacer lo siguiente en HQL:

SELECT 
    case when flag = true then SUM(col1) else SUM(col2)
FROM 
    myTable
sí, el caso es que trabajan en HQL ahora (estoy usando 3.5.5) stackoverflow.com/questions/3778583/…

OriginalEl autor lomaxx | 2009-01-19

7 Comentarios

  1. 10

    Supongo que se puede (3.6, 4.3) [en línea editar] …para donde-cláusulas:

    «Simple» caso, case ... when ... then ... else ... end, y «buscar» caso, case when ... then ... else ... end

    gracias por la respuesta… por desgracia esto es para la cláusula where no la instrucción select.
    Ah, que nos fijamos en eso. Lo siento por la lectura descuidada
    no hay problemas.. gracias por contribuir en cualquier caso

    OriginalEl autor Henrik Paul

  2. 5

    Al parecer, la capacidad de hacer esto fue añadido en 3.0.4, con la limitación de que no puede usar sub-selecciona en la cláusula else.

    gracias por el post. Por desgracia, esto es sólo para Hibernar y no NHibernate… pero esperemos que con esto de estar en modo de Hibernación no debería estar demasiado lejos antes de que sea en NHibernate

    OriginalEl autor Hilton Campbell

  3. 4

    Por debajo usted puede encontrar un trabajo de consulta (hibernate en postgresql) que utiliza 2 caso de declaraciones para reemplazar un valor booleano con la correspondiente representación textual.

    SELECT CASE ps.abra CUANDO es true ENTONCES
    ‘ABRIR’ else ‘CERRADO’ FINAL, CASO
    ps.completo CUANDO es true THEN ‘COMPLETO’ else
    ‘LIBRE’ FINAL, ps.availableCapacity
    DE ParkingState como ps

    En MSSQL este no funciona correctamente. Tuve que usar ‘1’ en lugar de ‘true’. : «SELECT CASE ps.abierto AL 1, a CONTINUACIÓN, ‘ABRIR’ else ‘CERRADO’ FINAL»

    OriginalEl autor Ruben

  4. 0

    Podemos usar el modo de hibernación consulta HQL mucho y creo que, finalmente, hay un hackish manera de hacer una cosa :

    Suponiendo que originalmente tenía una consulta de

    i2.element.id = :someId

    Entonces decidió expandir esto a ser algo como esto:

    ((i.element.id = :someId and i2.element.id=:someId) or (i2.element.id = :someId))

    Pero hubo un problema por el que queremos que sólo la búsqueda para esto basado en classType para un caso de declaración:

    (case when type(i)=Item then 
    ((i.element.id = :someId and i2.element.id=:someId) or (i2.element.id = :someId))
    else
    i.element.id = :someId
    end)

    De arriba no funciona, usted podría hacer una versión fácil de arriba de trabajo por hacer:

    (case when type(i)=Item then 
    i2.element.id
    else
    i.element.id
    end)=:elementId

    Pero esto en realidad no hace lo que nosotros necesitamos, queremos hacer exacta de la consulta anterior, así que sabiendo que usted puede asignar una variable al final de una declaración de caso en donde hay no poco de HQL:

    (
                                (
                                    (case when 
                                        type(r)=Item then 
                                            i.element.id 
                                        else 
                                            i.element.id end) = :elementId 
                                    and 
                                    (case when 
                                        type(r)=Item then 
                                            i2.element.id 
                                        else 
                                            i.element.id end) = :elementId
                                )
                                or 
                                (case when 
                                        type(r)=Item then 
                                            i2.element.id 
                                        else 
                                            i.element.id end) = :elementId 
                                )

    He podido hacer la consulta ahora trabajo basado en la declaración de caso, seguro que es mucho más largo aliento, pero en realidad hace lo mismo que la primera instancia

    OriginalEl autor Vahid

  5. 0

    Yo que enfrentan el mismo problema en HQL, a continuación, he resuelto de la siguiente consulta es

    select CONCAT(event.address1,', ', CASE WHEN event.address2 IS NULL THEN '' ELSE concat(event.address2,', ') END, event.city from EventDetail event where event.startDate>=:startDate and event.endDate<=:endDate;

    OriginalEl autor Faiz Akram

  6. -1

    Este es un ejemplo del uso de una comparación de cadenas en la condición:

    SELECT CASE f.type WHEN 'REMOVE'
                       THEN f.previousLocation 
                       ELSE f.currentLocation 
           END 
    FROM FileOperation f
    esto funciona y para mí es la respuesta correcta

    OriginalEl autor

Dejar respuesta

Please enter your comment!
Please enter your name here