ЕСЛИ ПОТОМ в SQL выберите оператор - PullRequest
3 голосов
/ 16 апреля 2019

Я пишу отчет, чтобы вернуть имена поставщиков из транзакций журнала. Вот основы запроса ниже.

Я использую данные из двух представлений:

  • Детальный вид журнала = pa_journal_detail
  • Подробный вид поставщика = ap_vendor

совпадение с номером поставщика:

Номер поставщика содержится в следующих полях:

  1. ap_vendor.a_vendor_number
  2. pa_journal_detail.jl_ref1 [при определенных критериях, показанных ниже] ТОЛЬКО КОГДА исходный код журнала - «API» или «APM»

Исходный код хранится в поле pa_journal_detail. jl_source_code

Имя поставщика хранится в поле ap_vendor.a_vendor_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

Ответы [ 3 ]

1 голос
/ 16 апреля 2019

для сравнения строк необходимо использовать одинарные кавычки

 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
0 голосов
/ 16 апреля 2019

Существует также iif () . Я использую его гораздо чаще, чем должен, мне просто нравится иметь крошечное, если для простой условной работы вместо большого 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
0 голосов
/ 16 апреля 2019

Я думаю, что выражение case может быть неправильным инструментом для работы.Если вы хотите присоединиться к столу , иногда , то left join может быть проще:

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...