我需要在 PostgreSQL 数据库上编写 HQL 查询(如果可能的话不是原生 SQL),选择 attr
值大于 39 的行。问题是 attr
column 是一个 varchar 列,不仅包含数字。我只需要数字并且只需要大于 39。适合我的 native 查询如下:
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
最佳答案
尝试创建一个像这样的 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函数,如parse_attr_to_boolean
, 如果在 SELECT 子句中使用该函数。但是,由于您在 WHERE 子句中使用它,因此它可以按原样传递给 SQL 查询。
关于sql - 在 varchar 列中进行数字比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55745721/