Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/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
预期字符数和Oracle_Oracle - Fatal编程技术网

预期字符数和Oracle

预期字符数和Oracle,oracle,Oracle,您好,我将权重存储在数据库中,就好像不必使用权重和数字一样 当出现“-”时,会出现错误 SELECT ( CASE WHEN s.weight = '-' THEN s.weight ELSE SUM(s.weight) END ) AS weight FROM shipping s WHERE s.id_packing_info = 257834; 为什么??因为它必须先输入on,然后再输入EL

您好,我将权重存储在数据库中,就好像不必使用权重和数字一样

当出现“-”时,会出现错误

    SELECT
  (
    CASE     
      WHEN  s.weight = '-'  THEN s.weight      
      ELSE SUM(s.weight)
      END
   ) AS weight
FROM
  shipping s
WHERE
  s.id_packing_info = 257834; 

为什么??因为它必须先输入on,然后再输入ELSE。

您可以在聚合和函数中计算case表达式:

**ORA-00932: inconsistent datatypes: expected CHAR got NUMBER
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:
Error at Line: 185 Column: 12**  on **ELSE SUM(s.weight)**
如果ID只有值“-”,则case表达式的计算结果为null,因此总和也为null;那就是NVL回到短跑

如果ID有任何“number”值,则案例将计算这些值的实际值,并且总和按预期工作,且不为null。如果你同时有数字和一个破折号,而你说你没有这个破折号,那么破折号仍然被计算为空,但是数字仍然被求和,因此破折号被有效地忽略了

演示一些虚构的数据:

SELECT
  NVL(TO_CHAR(SUM(
      CASE WHEN s.weight = '-' THEN NULL ELSE TO_NUMBER(s.weight) END
    )), '-') AS weight
FROM
  shipping s
WHERE
  s.id_packing_info = 257834; 
明确的TO_数字并不是真的必要,但它使它更清晰了一点。但是需要显式的TO_CHAR,以阻止NVL尝试将破折号转换为与求和结果相同的数据类型,从而得到ORA-01722

这与您在原始代码中获得ORA-00932的原因基本相同。case表达式的第一个分支计算为字符串,因此它希望第二个分支也这样做;但SUM给出的是一个数字,而不是字符串。那么,您可能会认为您可以将其更改为:

with shipping (id_packing_info, weight) as (
  select 257834, '-' from dual
  union all select 257835, '2' from dual
  union all select 257835, '3' from dual
  union all select 257836, '4' from dual
  union all select 257836, '5' from dual
  union all select 257836, '-' from dual
)
SELECT
  NVL(TO_CHAR(SUM(
      CASE WHEN s.weight = '-' THEN NULL ELSE TO_NUMBER(s.weight) END
    )), '-') AS weight
FROM
  shipping s
WHERE
  s.id_packing_info = 257834; 

WEIGHT                                 
----------------------------------------
-                                       

...
WHERE
  s.id_packing_info = 257835; 

WEIGHT                                 
----------------------------------------
5                                       

...
WHERE
  s.id_packing_info = 257836; 

WEIGHT                                 
----------------------------------------
9                                       

但这是聚合值和非聚合值的混合,因此最终会得到ORA-00937:不是单个组函数。

您可以在聚合和函数中计算case表达式:

**ORA-00932: inconsistent datatypes: expected CHAR got NUMBER
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:
Error at Line: 185 Column: 12**  on **ELSE SUM(s.weight)**
如果ID只有值“-”,则case表达式的计算结果为null,因此总和也为null;那就是NVL回到短跑

如果ID有任何“number”值,则案例将计算这些值的实际值,并且总和按预期工作,且不为null。如果你同时有数字和一个破折号,而你说你没有这个破折号,那么破折号仍然被计算为空,但是数字仍然被求和,因此破折号被有效地忽略了

演示一些虚构的数据:

SELECT
  NVL(TO_CHAR(SUM(
      CASE WHEN s.weight = '-' THEN NULL ELSE TO_NUMBER(s.weight) END
    )), '-') AS weight
FROM
  shipping s
WHERE
  s.id_packing_info = 257834; 
明确的TO_数字并不是真的必要,但它使它更清晰了一点。但是需要显式的TO_CHAR,以阻止NVL尝试将破折号转换为与求和结果相同的数据类型,从而得到ORA-01722

这与您在原始代码中获得ORA-00932的原因基本相同。case表达式的第一个分支计算为字符串,因此它希望第二个分支也这样做;但SUM给出的是一个数字,而不是字符串。那么,您可能会认为您可以将其更改为:

with shipping (id_packing_info, weight) as (
  select 257834, '-' from dual
  union all select 257835, '2' from dual
  union all select 257835, '3' from dual
  union all select 257836, '4' from dual
  union all select 257836, '5' from dual
  union all select 257836, '-' from dual
)
SELECT
  NVL(TO_CHAR(SUM(
      CASE WHEN s.weight = '-' THEN NULL ELSE TO_NUMBER(s.weight) END
    )), '-') AS weight
FROM
  shipping s
WHERE
  s.id_packing_info = 257834; 

WEIGHT                                 
----------------------------------------
-                                       

...
WHERE
  s.id_packing_info = 257835; 

WEIGHT                                 
----------------------------------------
5                                       

...
WHERE
  s.id_packing_info = 257836; 

WEIGHT                                 
----------------------------------------
9                                       

但这是聚合值和非聚合值的混合,因此最终会得到ORA-00937:不是一个单一的组函数。

或者您可以再添加一个条件来跳过此类记录

CASE     
  WHEN  s.weight = '-'  THEN s.weight      
  ELSE TO_CHAR(SUM(s.weight))
  END

或者,您可以再添加一个条件以跳过此类记录

CASE     
  WHEN  s.weight = '-'  THEN s.weight      
  ELSE TO_CHAR(SUM(s.weight))
  END

权重列的数据类型是什么?这个问题不清楚:您试图实现什么?是否要计算所有不是“-”的值的总和?例如,如果有3个值:“555”、“666”和“-”,你想得到555+666,所以结果是“1221”?@MarcusH OP使用“-”作为空值,所以我假设VARCHAR2-但肯定不是十进制数…不幸的是varchar@Marcus Hthere不能有像“22”“33”和“-”这样的三个值。它是“-”或值。如果不是“-”来求该ID的所有权重之和,那么权重列的数据类型是什么?这个问题不清楚:您试图实现什么?是否要计算所有不是“-”的值的总和?例如,如果有3个值:“555”、“666”和“-”,你想得到555+666,所以结果是“1221”?@MarcusH OP使用“-”作为空值,所以我假设VARCHAR2-但肯定不是十进制数…不幸的是varchar@Marcus Hthere不能有像“22”“33”和“-”这样的三个值。它是“-”或值。如果不是“-”,则对该id的所有权重求和