【问题标题】:Case Statement in SQL Query IssueSQL 查询问题中的案例语句
【发布时间】:2018-06-21 07:56:10
【问题描述】:

我正在尝试运行 SQL 查询,但运行时出错。

错误:

[代码:-811,SQL 状态:21000]
标量全查询、SELECT INTO 语句或 VALUES INTO 语句的结果多于一行..
SQLCODE=-811, SQLSTATE=21000, DRIVER=4.19.49

这是我尝试运行的 SQL 查询,我认为我的 CASE 语句有问题,我的解决方案已经用完了。请帮忙,非常感谢!

SELECT 
    ES.SHPMNT_REF,
    (CASE 
        WHEN (ES.SERVICE_PROVIDER_NAME) IS NULL
           THEN (SELECT BRDB.EXPORT_ONHAND.SERVICE_PROVIDER_NAME 
                 FROM BRDB.EXPORT_ONHAND 
                 WHERE BRDB.EXPORT_ONHAND.SHPMNT_REF = ES.SHPMNT_REF)
           ELSE (ES.SERVICE_PROVIDER_NAME)
     END) AS SP
FROM 
    BRDB.EXPORT_SHIPMENT ES
WHERE 
    ES.DATE_CREATE > CURRENT TIMESTAMP - 30 DAYS

【问题讨论】:

  • 不要选择CASEinside,你应该加入BRDB.EXPORT_SHIPMENTBRDB.EXPORT_ONHAND
  • 您的子查询 (SELECT BRDB.EXPORT_ONHAND.SERVICE_PROVIDER_NAME from...) 返回不止一行,但您正尝试在查询的行级别使用它。 BRDB.EXPORT_ONHAND 表中是否有多个具有相同 SHPMNT_REF 值的记录?如果是这样,您需要重新考虑如何检索 SERVICE_PROVIDER_NAME 值。
  • 你的WHERE 也有一些无效的语法。我假设CURRENT TIMESTAMP - 30 DAYS 实际上应该是DATEADD(DAY, -30, CURRENT_TIMESTAMP)?
  • @mshsayem 谢谢兄弟!效果很好!

标签: sql sql-server


【解决方案1】:

我想这就是你所追求的。加入您可能需要的表数据,然后让 COALESCE 检查 null 并获取其他数据(如果是)。

SELECT 
    ES.SHPMNT_REF,
    COALESCE(ES.SERVICE_PROVIDER_NAME, OH.SERVICE_PROVIDER_NAME) AS SP
FROM BRDB.EXPORT_SHIPMENT ES
    LEFT JOIN BRDB.EXPORT_ONHAND AS OH 
        ON ES.SHPMNT_REF = OH.SHPMNT_REF
WHERE 
    ES.DATE_CREATE > CURRENT TIMESTAMP - 30 DAYS

【讨论】:

    【解决方案2】:

    也许你应该放在箱子里:

    THEN (SELECT TOP 1 BRDB.EXPORT_ONHAND.SERVICE_PROVIDER_NAME
    

    【讨论】:

      【解决方案3】:

      由于您的子查询返回多个值而引发错误。 最好的方法是先连接两个表,然后在值为 NULL 时获取所需的值。 这应该工作:

      SELECT 
          ES.SHPMNT_REF
          ,CASE
             WHEN ES.SERVICE_PROVIDER_NAME IS NULL
               THEN EO.SERVICE_PROVIDER_NAME 
             ELSE ES.SERVICE_PROVIDER_NAME
           END AS 'SP'
      FROM BRDB.EXPORT_SHIPMENT ES
      LEFT JOIN BRDB.EXPORT_ONHAND EO
      ON ES.SHPMNT_REF = EO.SHPMNT_REF
      
      WHERE ES.DATE_CREATE > CURRENT TIMESTAMP - 30 DAYS
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-24
        • 1970-01-01
        • 2017-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多