【问题标题】:PostgreSQL - How to cast dynamically?PostgreSQL - 如何动态投射?
【发布时间】:2019-09-01 06:47:41
【问题描述】:

我有一列以文本形式包含数据集的类型。

所以我想做这样的事情:

SELECT CAST ('100' AS %INTEGER%);
SELECT CAST (100 AS %TEXT%);

SELECT CAST ('100' AS (SELECT type FROM dataset_types WHERE id = 2));

PostgreSQL 可以吗?

【问题讨论】:

  • 我目前不知道这是否可行。我很好奇您如何定义WHERE id = 2 我的意思是,如果您知道要查看的数据类型意味着您已经知道数据类型对吗?
  • 而且,这可能会对您有所帮助:stackoverflow.com/questions/3827828/…
  • 这是不可能的——除非你使用动态 SQL。列的类型固定在SELECT;它不是可变的。
  • 不,这是不可能的。 PostgreSQL 的语法解析器在这里拒绝任何动态元素。即使有可能,您也必须确保源类型和目标类型之间的转换实际上是可能的。您认为需要数据库而不是应用程序来执行此操作是否有具体原因?

标签: sql database postgresql


【解决方案1】:

SQL 是强类型和静态的。 Postgres 要求在调用时知道列数及其数据类型。因此,您需要在其中一种过程语言扩展中使用动态 SQL。然后您仍然面临函数(必然)具有固定返回类型的障碍。相关:

或者你采用两步流程。首先连接查询字符串(与另一个SELECT 查询)。然后执行生成的查询字符串。两次往返服务器。

  1. SELECT '100::' || type FROM dataset_types WHERE id = 2; -- 记录结果字符串

  2. 执行结果。 (并确保您没有为 SQL 注入打开任何向量!)

关于短转换语法:

【讨论】:

    猜你喜欢
    • 2012-05-14
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多