Сравните численно в колонке varchar - PullRequest
2 голосов
/ 18 апреля 2019

Мне нужно написать HQL-запрос (по возможности, не собственный SQL) на базе данных PostgreSQL, которая выбирает строки, значения attr которых больше 39. Проблема в том, что столбец attr является столбцом varchar и содержит не только числа , Мне нужны только цифры и только больше 39. Собственный запрос, который работает для меня, выглядит следующим образом:

SELECT * FROM my_table WHERE attr ~ '^[0-9\.]+$' AND CAST(attr AS BIGINT) > 39;

Я пробовал следующие HQL-эквиваленты (ни один из которых не работает):

1. SELECT myTable FROM MyTable myTable WHERE attr ~ '^[0-9\.]+$' AND CAST(attr AS long) > 39; //~ cannot be used in HQL query
2. SELECT myTable FROM MyTable myTable WHERE ISNUMERIC(attr) = 1 AND CAST(attr AS long) > 39; //cannot extract result set
3. SELECT myTable FROM MyTable myTable WHERE attr LIKE '^[0-9\.]+$' AND CAST(attr AS long) > 39; //cannot extract result set
4. SELECT myTable FROM MyTable myTable WHERE CAST(attr AS long) > 39; //cannot extract result set
5. SELECT myTable FROM MyTable myTable WHERE attr > '39'; //wrong data types - rows with 4 in the attr column are found

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Попробуйте создать функцию PostgreSQL, например, такую:

CREATE FUNCTION parse_attr_to_boolean(attr character varying) RETURNS BOOLEAN AS $$
        BEGIN
                RETURN attr ~ '^[0-9\.]+$' AND CAST(attr AS BIGINT) > 39;
        END;
$$ LANGUAGE plpgsql;

Теперь вы можете просто вызвать функцию в своем HQL-запросе:

SELECT t 
FROM MyTable t 
WHERE parse_attr_to_boolean(t.attr)

Как я объяснил в этой статье вам нужно зарегистрировать функцию SQL, только если эта функция используется в предложении SELECT.Однако, поскольку вы используете его в предложении WHERE, его можно просто передать как есть в запрос SQL.

0 голосов
/ 18 апреля 2019

Вы можете применить этот трюк:

SUBSTRING(
  CONCAT('00000000000000000000', attr), 
  LENGTH(attr) + 1, 
  20
) > '00000000000000000039'

Я использовал случайное число из 20 0 цифр. Если у вас есть большие цифры в attr, вам нужно адаптироваться. Это не заботится о attr потенциально совпадающих строковых данных, но я уверен, что у вас есть какой-то другой столбец, который поможет вам более надежно интерпретировать содержимое столбца attr.

Но, конечно, я бы определенно рекомендовал прекратить использование анти-паттерна EAV и / или использовать соответствующие типы данных ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...