由于对问题的描述不准确,我已经完全重写了我的问题!
我们必须存储有关特定区域的大量不同信息。为此,我们需要一个灵活的数据结构,它不会限制用户的可能性。
因此,我们为这些附加数据创建了一个键值表,它通过包含值数据类型的元表进行描述。
我们已经使用这些信息来查询我们的 rest api。然后我们自动将请求的字段包装到 cast
中。
我们将此数据与来自其他表的信息一起作为 JSON
对象返回。我们使用 array_agg
和 json_object
将 data-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/