sql - 选择查询中的动态类型转换

标签 sql arrays json postgresql casting

由于对问题的描述不准确,我已经完全重写了我的问题!

我们必须存储有关特定区域的大量不同信息。为此,我们需要一个灵活的数据结构,它不会限制用户的可能性。

因此,我们为这些附加数据创建了一个键值表,它通过包含值数据类型的元表进行描述。

我们已经使用这些信息来查询我们的 rest api。然后我们自动将请求的字段包装到 cast 中。

enter image description here SQL Fiddle

我们将此数据与来自其他表的信息一起作为 JSON 对象返回。我们使用 array_aggjson_objectdata-table 中的相应行转换为 JSON 对象:

...
CASE
    WHEN count(prop.name) = 0 THEN '{}'::json
    ELSE json_object(array_agg(prop.name), array_agg(prop.value))
END AS data
...

这很好用。现在我们遇到的问题是,如果我们将 float 之类的数据存储到该字段中,那么我们将返回该数字的字符串表示形式:

e.g. 5.231 returns as "5.231"

现在我们想在我们的选择语句中将这个数字CAST为正确的数据格式,这样 JSON 结果就会被正确格式化。我们拥有所需的所有信息,因此我们尝试了以下操作:

SELECT 
json_object(array_agg(data.name),
            -- here I cast the value into the right datatype! 
            -- results in an error
            array_agg(CAST(value AS datatype))) AS data
FROM data
JOIN (
    SELECT name, datatype
    FROM meta)
AS info
ON info.name = data.name

错误信息如下:

ERROR:  type "datatype" does not exist
LINE 3:    array_agg(CAST(value AS datatype))) AS data
                                   ^
Query failed
PostgreSQL said: type "datatype" does not exist

那么是否可以将 data_type 列的文本动态转换为 postgresql 类型 以返回格式良好的 JSON 对象?

最佳答案

首先,这是对 SQL 的严重滥用,在几乎所有情况下都应该避免。如果你有一个合法的场景,你可能已经非常了解你的 RDBMS,你正在编写自定义索引插件,甚至不会想到问这个问题......

如果您告诉我们您实际想做什么,我们有大约 99.9% 的机会可以告诉您更好的方法。

现在抛开免责声明:

如果不使用动态 SQL,这是不可能的。使用足够新的 PostgreSQL 版本,您可以使用“立即执行”来完成此操作,您可以阅读有关 in the manual 的内容。 .它基本上归结为使用 EXEC

但是请注意,即使使用此方法,同一查询中获取的每一行的结果也必须具有相同的数据类型。换句话说,您不能期望第 1 行的数据类型为 VARCHAR,而第 2 行的数据类型为 INT。那是完全不可能的。

关于sql - 选择查询中的动态类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34267652/

相关文章:

javascript - Vue 输入传递一个数组

javascript - 将对象属性添加到 JSON 对象中

sql - 优化一条 SQL 查询 : call a function or do a join?

java - 使用 hashCode 获取数组 java 元素的索引

mysql - 使用 case when then 根据另一表的值更新一个表

javascript - 基于嵌套对象数组的过滤

javascript - 在 XMLHttpRequest 之后向 JSON 添加数据

python - 如何通过 API 请求提取 JSON 内容?

mysql - 在 'Where' 子句中执行两个子查询的良好替代方案

sql - 递归 CTE 的执行速度比硬编码递归操作慢