我仍然是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),' ... ^ 提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。
答案 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_name
和attribute_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%'