sql - 在 varchar 列中进行数字比较

标签 sql postgresql hibernate function hql

我需要在 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/

相关文章:

java - 如何使 @ManyToOne 实体成为 hibernate 中类的 ID

sql - (Oracle) 使用分页查询时如何获取结果总数?

mysql - 使用子查询的查询需要比使用固定数据而不是子查询的相同查询更长的时间

sql - 使用虚拟默认列取 SQL 平均值

arrays - rails 3 postgres 数组支持

Postgresql触发器执行错误

eclipse - 使用Spring+Hibernate部署Maven项目到Tomcat

sql - SAP HANA SQL如何将CreateTS UpdateTS CreareTime UpdateTime转换为timestampdate

sql - 使用空列创建唯一约束

java - 如何命名自 JPA 2.1 以来的 ManyToOne 引用的外键约束?