SELECT Sub Query PostgreSQL

时间:2015-10-23 06:07:00

标签: sql postgresql subquery

我仍然是postgres的新手。我想在查询的SELECT部分​​中有一个SELECT语句,但是现在我收到了一个错误。

SELECT cu.user_name, cu.created_date, cu.updated_date, cu.email_address,
       cua.attribute_name, cua.attribute_value,
       (select to_char(to_timestamp(cua.attribute_value / 1000), 'yyyy-mm-dd HH24:MI:SS')) AS Issue_Update
FROM cwd_user cu
INNER JOIN cwd_user_attribute cua ON cu.id = cua.user_id
WHERE cu.user_name LIKE 'perter%'

我收到以下错误:

  

错误:运算符不存在:字符变化/整数   第3行:(选择to_char(to_timestamp(cua.attribute_value / 1000),' ...                                                             ^   提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。

3 个答案:

答案 0 :(得分:2)

Apparenlty cua.attribute_value定义为varchar。错误消息告诉您不能将字符串除以数字。

您需要将varchar转换(强制转换)为整数。你根本不需要select

这是您当前设计的解决方法:

SELECT cu.user_name, 
       cu.created_date, 
       cu.updated_date, 
       cu.email_address, 
       cua.attribute_name, 
       cua.attribute_value,
       to_char(to_timestamp(cua.attribute_value::bigint / 1000), 'yyyy-mm-dd HH24:MI:SS') AS Issue_Update
FROM cwd_user cu
  JOIN cwd_user_attribute cua ON cu.id = cua.user_id
WHERE cu.user_name LIKE 'perter%';

::bigint将字符串转换为整数值。它是ANSI SQL cast(... as bigint)运算符的Postgres特定语法。有关详细信息,请参阅the manual

但是,如果cua.attribute_value包含无法转换为整数的值,则会失败(空字符串''会破坏它)。

正确的解决方案是在integer列中存储数字。不要将数字存储为varchar

attribute_nameattribute_value听起来非常像(反)模式称为"实体 - 属性 - 值"。

如果您确定时间戳信息对于具有特定名称的属性是正确的,您可以执行以下操作以避免出错:

       CASE WHEN cua.attribute_name = 'timestamp' THEN
         to_char(to_timestamp(cua.attribute_value::bigint / 1000), 'yyyy-mm-dd HH24:MI:SS') 
       END AS Issue_Update

对于NULL不是attribute_name的所有行,以及那些格式化的时间戳,这将返回'timestamp'。但是,只有当该属性的值是有效数字时才会有效(当然,您需要调整与字符串文字'timestamp'的比较以使用正确的属性名称)

答案 1 :(得分:1)

SELECT cu.user_name, cu.created_date, cu.updated_date, 
cu.email_address, cua.attribute_name, cua.attribute_value,
case when (attribute_value like '%True%' or attribute_value like '%False%') then cast(NULL as bigint)
     else CAST(nullif(cua.attribute_value, '') AS bigint)
     end filter_attribute_value,
(select to_char(to_timestamp(
filter_attribute_value / 1000), 'yyyy-mm-dd HH24:MI:SS')) AS Issue_Update
FROM cwd_user cu
INNER JOIN cwd_user_attribute cua ON cu.id = cua.user_id
WHERE cu.user_name LIKE 'perter%'

答案 2 :(得分:0)

试试这个。但我不确定你是否可以将其转换为时间戳。转换为时间戳时可能会出现另一个错误。无论如何都试一试。

    SELECT cu.user_name, cu.created_date, cu.updated_date, 
    cu.email_address, cua.attribute_name, cua.attribute_value,
    (select to_char(to_timestamp(cast(cua.attribute_value as double precision) / 1000), 'yyyy-mm-dd HH24:MI:SS')) AS Issue_Update
    FROM cwd_user cu
    INNER JOIN cwd_user_attribute cua ON cu.id = cua.user_id
    WHERE cu.user_name LIKE 'perter%'