Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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
如果在SQL Select语句中_Sql_Sql Server_Tsql - Fatal编程技术网

如果在SQL Select语句中

如果在SQL Select语句中,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在写一份报告,从日记账交易中返回供应商名称。下面是查询的基础知识 我使用的数据来自两个视图: 日志详细信息视图=pa\u日志详细信息 供应商详细信息视图=ap\u供应商 匹配供应商编号: 供应商编号包含在以下字段中: ap\u供应商。供应商编号 pa_journal_detail.jl_ref1[在如下所示的特定标准下]仅当日志源代码为“API”或“APM”时 源代码存储在字段pa\u journal\u detail中。jl_源代码 供应商名称存储在字段ap\u vendor.a\u

我正在写一份报告,从日记账交易中返回供应商名称。下面是查询的基础知识

我使用的数据来自两个视图:

  • 日志详细信息视图=
    pa\u日志详细信息
  • 供应商详细信息视图=
    ap\u供应商
匹配供应商编号:

供应商编号包含在以下字段中:

  • ap\u供应商。供应商编号
  • pa_journal_detail.jl_ref1
    [在如下所示的特定标准下]仅当日志源代码为“API”或“APM”时
  • 源代码存储在字段
    pa\u journal\u detail中。jl_源代码

    供应商名称存储在字段
    ap\u vendor.a\u vendor\u name

    这是我开始的问题。当我尝试运行时,它返回错误的语法错误

    SELECT
    CASE
              WHEN pa_journal_detail. jl_source_code = ‘API’
                   OR pa_journal_detail. jl_source_code = ‘APM’
              THEN(
                  SELECT  a_vendor_name
                  FROM ap_vendor
                  INNER JOIN pa_journal_detail 
                  ON pa_journal_detail.jl_ref1 = ap_vendor.a_vendor_number)
              ELSE 0
      END as a_vendor_name, *
      FROM  pa_journal_detail
    
    下面是完整的查询。我也尝试过,包括“前1名”。我现在得到的错误是关键字AS附近有不正确的语法

    SELECT
       pa_journal_detail.a_project
      ,pa_journal_detail.jl_seg2
      ,pa_journal_detail.jl_seg3
      ,pa_journal_detail.jl_seg4
      ,pa_journal_detail.jl_source_code
      ,pa_journal_detail.jl_ref1
      ,pa_journal_detail.jl_gl_org
      ,pa_journal_detail.jl_gl_obj
      ,pa_journal_detail.jl_line_num
      ,pa_journal_detail.jl_journal_num
      ,pa_journal_detail.jl_jnl_year_period
      ,pa_journal_detail.jl_journal_number
      ,pa_journal_detail.jl_journal_seq
      ,(SELECT(CASE
                  WHEN pa_journal_detail. jl_source_code = 'API'
                       OR pa_journal_detail. jl_source_code = 'APM'
                  THEN(
                      SELECT TOP 1 a_vendor_name 
                      FROM ap_vendor
                      RIGHT JOIN pa_journal_detail 
                      ON pa_journal_detail.jl_ref1 = ap_vendor.a_vendor_number
                     )
                  ELSE 0
          END as 'a_vendor_name', *
          FROM  pa_journal_detail))
    FROM pa_journal_detail
    
    这就是我的结局,它现在起作用了!谢谢大家!

    SELECT
       pa_journal_detail.a_project
      ,pa_journal_detail.jl_seg2
      ,pa_journal_detail.jl_seg3
      ,pa_journal_detail.jl_seg4
      ,pa_journal_detail.jl_source_code
      ,pa_journal_detail.jl_ref1
      ,pa_journal_detail.jl_gl_org
      ,pa_journal_detail.jl_gl_obj
      ,pa_journal_detail.jl_line_num
      ,pa_journal_detail.jl_journal_num
      ,pa_journal_detail.jl_jnl_year_period
      ,pa_journal_detail.jl_journal_number
      ,pa_journal_detail.jl_journal_seq
      ,iif((pa_journal_detail.jl_source_code = 'API' 
            OR pa_journal_detail.jl_source_code = 'APM')
            ,(SELECT TOP 1 a_vendor_name 
                      FROM ap_vendor
                      RIGHT JOIN pa_journal_detail 
                      ON pa_journal_detail.jl_ref1 = ap_vendor.a_vendor_number)
             ,0) as  'a_vendor_name'
    FROM pa_journal_detail
    

    对于字符串比较,您需要使用单引号

     CASE
                  WHEN pa_journal_detail. jl_source_code = 'API'
                       OR pa_journal_detail. jl_source_code = 'APM'
                  THEN(
                      SELECT top 1  a_vendor_name -- here you need limit or top 1
                      FROM ap_vendor
                      INNER JOIN pa_journal_detail 
                      ON pa_journal_detail.jl_ref1 = ap_vendor.a_vendor_number
                     )
                  ELSE 0
          END as a_vendor_name, *
          FROM  pa_journal_detail
    

    我认为一个
    案例
    表达式可能是这份工作的错误工具。如果您有时想加入表,则
    左加入可能更容易:

    SELECT    p.*, a.a_vendor_name
    FROM      pa_journal_detail p
    LEFT JOIN ap_vendor a ON p.jl_ref1 = a.a_vendor_number AND
              p.jl_source_code IN ('API', 'APM')
    
    还有。我使用它的频率远远超过我应该使用的频率,我只是喜欢用一个小小的if来表示简单的条件工作,而不是用大ole的Case语句

    select iif(1 = 1,'True','False') 
    -- any series that results in a boolean
    select iif((1 = 1 and 0 = 0) and (5 / 1 = 5 and 5 % 10 = 5),'True','False')
    
    谢谢你的提问

    SELECT
       pa_journal_detail.a_project
      ,pa_journal_detail.jl_seg2
      ,pa_journal_detail.jl_seg3
      ,pa_journal_detail.jl_seg4
      ,pa_journal_detail.jl_source_code
      ,pa_journal_detail.jl_ref1
      ,pa_journal_detail.jl_gl_org
      ,pa_journal_detail.jl_gl_obj
      ,pa_journal_detail.jl_line_num
      ,pa_journal_detail.jl_journal_num
      ,pa_journal_detail.jl_jnl_year_period
      ,pa_journal_detail.jl_journal_number
      ,pa_journal_detail.jl_journal_seq
      ,iif(pa_journal_detail.jl_source_code = 'API' OR pa_journal_detail.jl_source_code = 'APM',(SELECT TOP 1 a_vendor_name 
                      FROM ap_vendor
                      RIGHT JOIN pa_journal_detail 
                      ON pa_journal_detail.jl_ref1 = ap_vendor.a_vendor_number)
                     ,0)
                  'a_vendor_name', *
          FROM  pa_journal_detail))
    FROM pa_journal_detail
    

    具体错误是什么?首先,该子查询看起来应该返回多行(内部和外部数据之间没有相关性),这将导致其自身的问题。另外,是否有一些特定的原因使您没有使用
    左连接
    ?通常,使用
    CASE。。。()
    应该避免(尽管在某些特定情况下它可能会有所帮助),因为在大多数情况下,它会模糊数据关系。当我尝试使用这种方法时,会出现以下错误:“当子查询没有引入EXISTS时,只能在select列表中指定一个表达式”@丽贝卡:这里没有子查询。您是否将此片段用作某个更大查询的一部分?是的,我正试图这么做。@Rebeccasian,我可能还不够清楚。这不会替换共享查询中的
    大小写
    表达式,而是替换整个查询。如果这不是问题所在,并且您将此查询作为更大查询的一部分,请将其共享,我真的无法帮助您了解错误的原因。我已使用完整查询更新了问题。谢谢我尝试过这种方法和下面的示例,但在“当子查询没有引入EXISTS时,在select列表中只能指定一个表达式”上都出现了错误@Rebecca Christian在子查询中使用限制顺便问一下,您的dbms名称是什么?这是我的软件中的SQL Server数据库provider@RebeccaChristian然后使用top 1最好在top子句之后添加“order by”