Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 为什么我会遇到一个错误,即使在强制转换字段数据类型之后,我也无法连接两个不同的数据类型_Postgresql - Fatal编程技术网

Postgresql 为什么我会遇到一个错误,即使在强制转换字段数据类型之后,我也无法连接两个不同的数据类型

Postgresql 为什么我会遇到一个错误,即使在强制转换字段数据类型之后,我也无法连接两个不同的数据类型,postgresql,Postgresql,我在postgresql中有一个查询,当transaction.type=2(指取款)时,我想在transactions.amount字段中添加一个减号。我正在尝试将减号和transactions.amount字段转换为int。我将transactions.amount字段转换为text/varchar,但无论发生什么,我仍然会收到错误,“PostgreSql错误:案例类型数字和文本无法匹配” 这是我正在运行的查询 SELECT CAST(CASE WHEN "IsVoided" IS TRUE

我在postgresql中有一个查询,当transaction.type=2(指取款)时,我想在transactions.amount字段中添加一个减号。我正在尝试将减号和transactions.amount字段转换为int。我将transactions.amount字段转换为text/varchar,但无论发生什么,我仍然会收到错误,“PostgreSql错误:案例类型数字和文本无法匹配”

这是我正在运行的查询

SELECT CAST(CASE WHEN "IsVoided" IS TRUE THEN 0 
WHEN "Transactions"."TransactionType" = 2 
THEN CONCAT('-', CAST("Transactions"."Amount" AS TEXT))
ELSE "Transactions"."Amount" END AS Text) AS "TransAmount"
FROM "Transactions" 
LEFT JOIN "DepositSources" 
ON "Transactions"."DepositSourceId" = 
"DepositSources"."DepositSourceId" 
LEFT JOIN "WithdrawalSources" 
ON "Transactions"."WithdrawalSourceId" = 
"DepositSources"."DepositSourceId" 
WHERE "Transactions"."FundId" = 4 
AND "Transactions"."ReconciliationId" = 24
非常令人困惑的是,当我运行下面的查询时,它会按预期工作

从中选择CONCAT('-',CAST(“交易”,“金额”作为文本)) “交易”

CASE
表达式的所有分支都需要具有相同的类型。在这种情况下,您必须将所有分支设置为文本,因为接下来的
只能是文本。请尝试以下版本:

CASE WHEN IsVoided IS TRUE
     THEN '0' 
     WHEN Transactions.TransactionType = 2 
     THEN CONCAT('-', Transactions.Amount::text)
     ELSE Transactions.Amount::text END AS TransAmount
请注意,在
案例中使用逻辑是不常见的。通常,您只需检查单个列的值,而不是多个不同列的值

编辑:

似乎您对
CONCAT
的调用主要用于负值。以下是一种更简单的方法:

CASE WHEN IsVoided IS TRUE
     THEN 0
     WHEN Transactions.TransactionType = 2 
     THEN -1.0 * Transactions.Amount
     ELSE Transactions.Amount END AS TransAmount
在这种情况下,我们可以让
case
表达式只生成数字输出,这可能就是您真正想要的