Проблема при добавлении NULLS LAST - PullRequest
0 голосов
/ 25 октября 2019

При добавлении «NULLS LAST» в следующем запросе я получаю следующее исключение:

Причина: com.microsoft.sqlserver.jdbc.SQLServerException: значение не установлено дляномер параметра 11.

  1. Если я удаляю NULLS LAST, все работает нормально

  2. Если я удаляю код CASE WHEN и заказываю потолько один конкретный столбец работает с NULLS LAST, но мне нужны все столбцы в CASE WHEN.

    @Query("SELECT c FROM ClassSpecificationTableEntity c"
            + " LEFT JOIN c.owner  o "
            + " LEFT JOIN c.domain d "
            + "WHERE ISNULL(c.classStructure.classification.description, '')    LIKE :SEARCH "
            + "   OR ISNULL(c.classStructure.description, '')                       LIKE :SEARCH "
            + " OR ISNULL(d.description, '')                                            LIKE :SEARCH "
            + " OR ISNULL(o.description, '')                                            LIKE :SEARCH "
            + " OR ISNULL(c.measurementUnit, '')                                    LIKE :SEARCH "
            + " OR ISNULL(c.defaultValue, '')                                       LIKE :SEARCH "
            + " OR ISNULL(c.dataType, '')                                               LIKE :SEARCH "
            + " OR ISNULL(c.tooltip, '')                                                LIKE :SEARCH "
            + " ORDER BY "
            + "  CASE :ORDERBY" + 
            "    WHEN 0 THEN c.classStructure.classification.description " +
            "    WHEN 1 THEN c.assetAttribId " + 
            "    WHEN 2 THEN c.dataType " + 
            "    WHEN 3 THEN c.measurementUnit " + 
            "    WHEN 4 THEN c.domain.description " + 
            "    WHEN 5 THEN c.owner.description " + 
            "    WHEN 6 THEN c.defaultValue " + 
            "    WHEN 7 THEN c.tooltip " + 
            "    END DESC NULLS LAST" 
            )
    Page<ClassSpecificationTableEntity> findByLikeSearchDESC(@Param(value="SEARCH") final String searchCrit, final Pageable pageable, @Param(value="ORDERBY") final String orderBy);

1 Ответ

2 голосов
/ 25 октября 2019

Нет синтаксиса NULLS LAST для T-SQL.

Если вы хотите упорядочить значения NULL в последний раз, то обычно используйте выражение CASE или IIF:

--CASE Expression
CASE WHEN {expression} IS NULL THEN 1 ELSE 0 END
--IIF funciton (which is actually a shorthand CASE expression)
IIF({Expression} IS NULL, 1, 0)

Если у вас сложное выражение, для которого вы хотите упорядочить значения NULL в последнюю очередь, а затем выражение, и это выражение не появится в SELECT (поэтому на него нельзя ссылатьсяпо псевдониму), затем вы можете переместить выражение в FROM, чтобы избежать многократного ввода выражения:

FROM ...
     JOIN ...
     LEFT JOIN ...
     ...
     CROSS APPLY (VALUES({Expression}))V(Alias)
WHERE ...
ORDER BY IIF(V.Alias IS NULL,1,0),
         V.Alias
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...