【问题标题】:Error 'failed to find conversion function from unknown to text' in sql querysql查询中的错误'未能找到从未知到文本的转换函数'
【发布时间】:2018-06-06 06:53:51
【问题描述】:

我需要编写一个查询,如果我将一些字符串列表传递给该查询,那么它将检查特定表是否存在并返回不存在的。我为此编写了以下查询

SELECT temp_table.configuration_key FROM (#PLACEHOLDER) temp_table 
LEFT JOIN configuration c ON (c.configuration_key = temp_table.configuration_key) WHERE c.configuration_key IS NULL;

#PLACEHOLDER 将动态形成如下

1 .如果传递单个字符串 #PLACEHOLDER 将是

SELECT 'xyz' configuration_key

如果传递了多个字符串,#PLACEHOLDER 将是

SELECT 'xyz' configuration_key UNION ALL SELECT 'abc'

等等。

这里的第二个查询工作正常,但给第一个查询带来以下错误

failed to find conversion function from unknown to text 

配置表有一个名为 configuration_key 的列

谁能告诉我这里出了什么问题。如果只传递一个字符串,如何形成查询(即形成一个具有单个元素的表)。我知道我可以通过完全不同的查询来做到这一点。但是我不能使用相同类型的查询来做到这一点吗?

【问题讨论】:

  • 我的猜测是 NULL 正在被转换成文本,也许你不能这样做。不过,我不完全理解您在这里要做什么。
  • 帮助我们帮助您 - 请分享 configuration 表的结构(或者最好是 - DDL)。
  • 已更新。配置表有一个名为 configuration_key 的列

标签: sql postgresql


【解决方案1】:

我在尝试将一条记录写入数据库时​​遇到了类似的错误(无法找到从未知到字符变化的转换函数)。我的 in-DB_Write 工具直接从带有自定义查询的 in-DB_Connect 工具获取输入。我正在使用 Redshift 批量加载驱动程序进行写入(我没有看到配置特定 in-DB_Write 工具以使用常规驱动程序的方法)。批量加载驱动程序使用 COPY 命令从 S3 加载。

阅读您的帖子后,我怀疑 in-DB_Write 工具假设第一行是标题行,而实际数据从第二行开始。所以我在我的 in-DB_Connect 中对完全相同的 SQL 进行了联合,并且它起作用了。

总之,这失败了:

Select Coalesce(Max(etl_process_control.process_id), 0) + 1 as process_id
, 1 as job_id
, getdate() as process_start_dttm
, to_timestamp('1899-12-31 00:00:00','YYYY-MM-DD HH24:MI:SS') as process_end_dttm
, 'I' as process_status_cd
, 'In-Progress' as process_status_desc
, null as process_error_rsn
, -999 as rows_updated
, -999 as rows_inserted
, -999 as rows_deleted
, -999 as rows_failed
 From etl_process_control

但这有效:

Select Coalesce(Max(etl_process_control.process_id), 0) + 1 as process_id
, 1 as job_id
, getdate() as process_start_dttm
, to_timestamp('1899-12-31 00:00:00','YYYY-MM-DD HH24:MI:SS') as process_end_dttm
, 'I' as process_status_cd
, 'In-Progress' as process_status_desc
, null as process_error_rsn
, -999 as rows_updated
, -999 as rows_inserted
, -999 as rows_deleted
, -999 as rows_failed
 From etl_process_control
union
Select Coalesce(Max(etl_process_control.process_id), 0) + 1 as process_id
, 1 as job_id
, getdate() as process_start_dttm
, to_timestamp('1899-12-31 00:00:00','YYYY-MM-DD HH24:MI:SS') as process_end_dttm
, 'I' as process_status_cd
, 'In-Progress' as process_status_desc
, null as process_error_rsn
, -999 as rows_updated
, -999 as rows_inserted
, -999 as rows_deleted
, -999 as rows_failed
 From etl_process_control

最后,你会注意到我没有使用联合 ALL,所以上面的查询基本上只返回一行......但不知何故它可以工作。这不是一个理想的解决方案,但可以避免错误。

【讨论】:

    【解决方案2】:

    我不确定为什么单行子查询会出现此错误,但您可以使用显式类型转换,例如

    SELECT temp_table.configuration_key 
    FROM (SELECT 'xyz'::text configuration_key
    ) temp_table 
    LEFT JOIN configuration c ON (c.configuration_key = temp_table.configuration_key) 
    WHERE c.configuration_key IS NULL;
    

    SQL Fiddle

    【讨论】:

    猜你喜欢
    • 2014-10-01
    • 2013-08-07
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多