如何使用PostgreSQL计算列中有多少项是数字

如何使用PostgreSQL计算列中有多少项是数字,postgresql,count,alphanumeric,Postgresql,Count,Alphanumeric,我试图计算一列中有多少个条目是数字的,并且满足其他条件。我理解该脚本在SQL中的含义: SELECT COUNT(ingredients) FROM data.pie WHERE description LIKE 'cherry' AND is.numeric(price) = true 但我不知道如何将其转换为PostgreSQL脚本。任何帮助都将不胜感激 谢谢。您当前的查询稍加修改,应该可以: SELECT COUNT(ingredients) FROM

我试图计算一列中有多少个条目是数字的,并且满足其他条件。我理解该脚本在SQL中的含义:

    SELECT COUNT(ingredients)
    FROM data.pie
    WHERE description LIKE 'cherry'
      AND is.numeric(price) = true
但我不知道如何将其转换为PostgreSQL脚本。任何帮助都将不胜感激


谢谢。

您当前的查询稍加修改,应该可以:

SELECT COUNT(ingredients)
FROM data.pie
WHERE
    description LIKE 'cherry' AND
    price ~ '^[0-9]+([.][0-9]+)?$';

您当前的查询经过轻微修改后,应该可以工作:

SELECT COUNT(ingredients)
FROM data.pie
WHERE
    description LIKE 'cherry' AND
    price ~ '^[0-9]+([.][0-9]+)?$';

Tim展示的另一个替代方案是创建一个函数

CREATE OR REPLACE FUNCTION is_numeric(val VARCHAR) RETURNS BOOLEAN AS $$
DECLARE x NUMERIC;
BEGIN
    x = val::NUMERIC;
    RETURN TRUE;
    EXCEPTION WHEN OTHERS THEN    
    RETURN FALSE;
END;
$$
STRICT
LANGUAGE plpgsql IMMUTABLE;
。。可以这样使用:

db=# SELECT is_numeric('foo'), is_numeric('1'), is_numeric('1.39');
 is_numeric | is_numeric | is_numeric 
------------+------------+------------
 f          | t          | t
(1 Zeile)

Tim展示的另一个替代方案是创建一个函数

CREATE OR REPLACE FUNCTION is_numeric(val VARCHAR) RETURNS BOOLEAN AS $$
DECLARE x NUMERIC;
BEGIN
    x = val::NUMERIC;
    RETURN TRUE;
    EXCEPTION WHEN OTHERS THEN    
    RETURN FALSE;
END;
$$
STRICT
LANGUAGE plpgsql IMMUTABLE;
。。可以这样使用:

db=# SELECT is_numeric('foo'), is_numeric('1'), is_numeric('1.39');
 is_numeric | is_numeric | is_numeric 
------------+------------+------------
 f          | t          | t
(1 Zeile)


有没有非数字的价格?十四美元有没有非数字的价格?十四美元如果有提姆的空间,那么吉姆+1也有空间。@Alokin SELECT*FROM data.pie在哪里_numericprice@Alokin您必须首先创建函数。打开到postgres的连接并执行我在答案上写的CREATEFUNCTION语句。如果它在SELECT子句中起作用,那么它必须在WHERE子句中起作用well@Alokin请记住,此函数需要一个varchar作为参数。如错误消息所示,如果要传递数值,则必须强制转换:SELECT*FROM data.pie,其中是_numericprice::varchar。尽管我不确定它对您的用例是否有意义:D@Alokin没问题,很高兴有帮助。考虑关闭这个问题,以便其他人可以更容易地找到它。如果有提姆的空间,那么也有吉姆+ 1的空间。numericprice@Alokin您必须首先创建函数。打开到postgres的连接并执行我在答案上写的CREATEFUNCTION语句。如果它在SELECT子句中起作用,那么它必须在WHERE子句中起作用well@Alokin请记住,此函数需要一个varchar作为参数。如错误消息所示,如果要传递数值,则必须强制转换:SELECT*FROM data.pie,其中是_numericprice::varchar。尽管我不确定它对您的用例是否有意义:D@Alokin没问题,很高兴有帮助。考虑关闭这个问题,以便其他人可以更容易地找到它。我试着运行它,并且我在蒂尔达周围得到一个错误:错误:运算符不存在:数值~未知的提示:没有操作符匹配给定的名称和参数类型。您可能需要添加显式类型转换。这是否意味着它不认识蒂尔达?还是后面的条件呢?是你们的价格栏文字吗?请注意,理想情况下,价格应该存储在数字类型列中。您是对的。使用Jim的条目,我必须使这个price::varchar~“^[0-9]+[.][0-9]+?$”运行。那么price是什么类型的?我的意思是,你的问题只有在价格不是数字的情况下才有意义。在任何情况下,如上所述,您应该将价格存储在数字列中。“价格”标记为文本,但其中可能有一些数字,因此我进行此计数以确定有多少。我已经尝试运行了,我在tilda中得到一个错误,它说:error:operator不存在:numeric~unknown提示:没有与给定名称和参数类型匹配的运算符。您可能需要添加显式类型转换。这是否意味着它不认识蒂尔达?还是后面的条件呢?是你们的价格栏文字吗?请注意,理想情况下,价格应该存储在数字类型列中。您是对的。使用Jim的条目,我必须使这个price::varchar~“^[0-9]+[.][0-9]+?$”运行。那么price是什么类型的?我的意思是,你的问题只有在价格不是数字的情况下才有意义。在任何情况下,如上所述,您应该将价格存储在数字列中。“price”标记为文本,但其中可能包含一些数字,因此我进行此计数以确定有多少。