在varchar列中进行数字比较

时间:2019-04-18 12:07:19

标签: sql postgresql hibernate function hql

我需要在PostgreSQL数据库上编写HQL查询(如果可能的话,请不要使用本机SQL),以选择android { buildTypes { getByName("debug") { (this as ExtensionAware).extra["alwaysUpdateBuildId"] = false } } } 值大于39的行。问题是attr列是varchar列,不仅包含数字。我只需要数字,并且只需要大于39。对我有用的本机查询如下:

attr

我尝试了以下HQL等效项(均无效):

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

2 个答案:

答案 0 :(得分:1)

尝试创建像这样的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)

如我所解释的in this article,仅当SELECT子句中使用SQL函数时,才需要注册该函数。但是,由于您在WHERE子句中使用它,因此可以将其按原样传递给SQL查询。

答案 1 :(得分:0)

您可以应用此技巧:

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

我使用了20个0位数字的随机数。如果attr中的数字更大,则需要进行调整。这不会解决attr可能匹配的字符串数据的问题,但是我敢肯定您还有其他一些列可以帮助您更健壮地解释attr列的内容。

但是,当然,我绝对会建议首先停止使用EAV反模式,和/或使用适当的数据类型...