Можно ли поместить оператор select в оператор case?

В настоящее время я пытаюсь использовать оператор выбора внутри моего оператора выбора. Пока это отлично работает. Но я хочу, чтобы он выбирал что-то другое в зависимости от некоторых условий. Моя проблема заключается в том, чтобы поместить подзапрос оператора SQL в часть THEN оператора CASE, а не в часть WHEN. Мой пример — здесь. Итак, я хочу поместить оператор select в оператор CASE, который заключен в подзапрос. Также я использую SQL Server 2008.

Вот что у меня было изначально:

    SELECT DISTINCT
       WORK_ORDER.PART_ID,
       OPERATION.SEQUENCE_NO,
       OPERATION.RESOURCE_ID,
       OPERATION.SETUP_HRS,
       OPERATION.RUN_HRS,
       OPERATION.OPERATION_TYPE,
       OPERATION.RUN AS PCS_HR,
       REPLACE(CONVERT( VARCHAR(150), CONVERT(BINARY(150), OPERATION_BINARY.BITS)), CHAR(0), '') AS Specs_OPR,
       OPERATION.WORKORDER_BASE_ID,
       OPERATION.WORKORDER_LOT_ID,
       OPERATION.WORKORDER_SPLIT_ID,
       OPERATION.WORKORDER_SUB_ID,
       OPERATION.LOAD_SIZE_QTY,
       OPERATION.CALC_START_QTY,
       OPERATION.COMPLETED_QTY,
       (CEILING(OPERATION.CALC_START_QTY / OPERATION.LOAD_SIZE_QTY)) AS NUM_O_LOADS,
       ((OPERATION.CALC_START_QTY - OPERATION.COMPLETED_QTY) / OPERATION.LOAD_SIZE_QTY) AS LOADS_REMAINING,

       -- SubQuery

(
    SELECT DISTINCT
           descriptions = STUFF(
                               (
                                   SELECT ', '+CHAR(13)+PART.DESCRIPTION
                                   FROM dbo.PART
                                        JOIN REQUIREMENT ON PART.ID = REQUIREMENT.PART_ID
                                   WHERE REQUIREMENT.WORKORDER_BASE_ID = '026877'
                                         AND REQUIREMENT.OPERATION_SEQ_NO = '30'
                                   FOR XML PATH(''), TYPE
                               ).value('.[1]', 'nvarchar(max)'), 1, 2, '')
    FROM(REQUIREMENT R
         JOIN PART P ON R.PART_ID = P.ID)
) AS PART_DESCRIPTION

-- End of SubQuery

FROM OPERATION
     INNER JOIN WORK_ORDER ON OPERATION.WORKORDER_TYPE = WORK_ORDER.TYPE
                              AND OPERATION.WORKORDER_BASE_ID = WORK_ORDER.BASE_ID
                              AND OPERATION.WORKORDER_LOT_ID = WORK_ORDER.LOT_ID
                              AND OPERATION.WORKORDER_SPLIT_ID = WORK_ORDER.SPLIT_ID
                              AND OPERATION.WORKORDER_SUB_ID = WORK_ORDER.SUB_ID
     INNER JOIN OPERATION_BINARY ON OPERATION.WORKORDER_TYPE = OPERATION_BINARY.WORKORDER_TYPE
                                    AND OPERATION.WORKORDER_BASE_ID = OPERATION_BINARY.WORKORDER_BASE_ID
                                    AND OPERATION.WORKORDER_LOT_ID = OPERATION_BINARY.WORKORDER_LOT_ID
                                    AND OPERATION.WORKORDER_SPLIT_ID = OPERATION_BINARY.WORKORDER_SPLIT_ID
                                    AND OPERATION.WORKORDER_SUB_ID = OPERATION_BINARY.WORKORDER_SUB_ID
                                    AND OPERATION.SEQUENCE_NO = OPERATION_BINARY.SEQUENCE_NO
     JOIN REQUIREMENT ON REQUIREMENT.WORKORDER_BASE_ID = OPERATION.WORKORDER_BASE_ID
WHERE(REPLACE(CONVERT(VARCHAR(8000), CONVERT(BINARY(8000), OPERATION_BINARY.BITS)), CHAR(0), '') NOT LIKE '%Gupta%')
     AND OPERATION.WORKORDER_BASE_ID = '026877'
     AND WORK_ORDER.BASE_ID = '026877'; 

Это то, что у меня есть сейчас, но по какой-то причине мое дело создало 4-ю строку для моего результата из 3-х строк:

SELECT DISTINCT
       WORK_ORDER.PART_ID,
       OPERATION.SEQUENCE_NO,
       OPERATION.RESOURCE_ID,
       OPERATION.SETUP_HRS,
       OPERATION.RUN_HRS,
       OPERATION.OPERATION_TYPE,
       OPERATION.RUN AS PCS_HR,
       REPLACE(CONVERT( VARCHAR(150), CONVERT(BINARY(150), OPERATION_BINARY.BITS)), CHAR(0), '') AS Specs_OPR,
       OPERATION.WORKORDER_BASE_ID,
       OPERATION.WORKORDER_LOT_ID,
       OPERATION.WORKORDER_SPLIT_ID,
       OPERATION.WORKORDER_SUB_ID,
       OPERATION.LOAD_SIZE_QTY,
       OPERATION.CALC_START_QTY,
       OPERATION.COMPLETED_QTY,
       (CEILING(OPERATION.CALC_START_QTY / OPERATION.LOAD_SIZE_QTY)) AS NUM_O_LOADS,
       ((OPERATION.CALC_START_QTY - OPERATION.COMPLETED_QTY) / OPERATION.LOAD_SIZE_QTY) AS LOADS_REMAINING,

       -- SubQuery Inside Case

       CASE
           WHEN REQUIREMENT.OPERATION_SEQ_NO = '10'
                AND OPERATION.SEQUENCE_NO = '10'
           THEN
(
    SELECT DISTINCT
           descriptions = STUFF(
                               (
                                   SELECT ', '+CHAR(13)+PART.DESCRIPTION
                                   FROM dbo.PART
                                        JOIN REQUIREMENT ON PART.ID = REQUIREMENT.PART_ID
                                   WHERE REQUIREMENT.WORKORDER_BASE_ID = '026877'
                                         AND REQUIREMENT.OPERATION_SEQ_NO = '10'
                                   FOR XML PATH(''), TYPE
                               ).value('.[1]', 'nvarchar(max)'), 1, 2, '')
    FROM(REQUIREMENT R
         JOIN PART P ON R.PART_ID = P.ID)
)
       END AS DESCRIPTION

-- End of Subquery

FROM OPERATION
     INNER JOIN WORK_ORDER ON OPERATION.WORKORDER_TYPE = WORK_ORDER.TYPE
                              AND OPERATION.WORKORDER_BASE_ID = WORK_ORDER.BASE_ID
                              AND OPERATION.WORKORDER_LOT_ID = WORK_ORDER.LOT_ID
                              AND OPERATION.WORKORDER_SPLIT_ID = WORK_ORDER.SPLIT_ID
                              AND OPERATION.WORKORDER_SUB_ID = WORK_ORDER.SUB_ID
     INNER JOIN OPERATION_BINARY ON OPERATION.WORKORDER_TYPE = OPERATION_BINARY.WORKORDER_TYPE
                                    AND OPERATION.WORKORDER_BASE_ID = OPERATION_BINARY.WORKORDER_BASE_ID
                                    AND OPERATION.WORKORDER_LOT_ID = OPERATION_BINARY.WORKORDER_LOT_ID
                                    AND OPERATION.WORKORDER_SPLIT_ID = OPERATION_BINARY.WORKORDER_SPLIT_ID
                                    AND OPERATION.WORKORDER_SUB_ID = OPERATION_BINARY.WORKORDER_SUB_ID
                                    AND OPERATION.SEQUENCE_NO = OPERATION_BINARY.SEQUENCE_NO
     JOIN REQUIREMENT ON REQUIREMENT.WORKORDER_BASE_ID = OPERATION.WORKORDER_BASE_ID
WHERE(REPLACE(CONVERT(VARCHAR(8000), CONVERT(BINARY(8000), OPERATION_BINARY.BITS)), CHAR(0), '') NOT LIKE '%Gupta%')
     AND OPERATION.WORKORDER_BASE_ID = '026877'
     AND WORK_ORDER.BASE_ID = '026877';

person Azuraith    schedule 08.09.2016    source источник
comment
Итог: нет, вы не можете, но если вы вставите оператор SQL в вопрос, я уверен, что мы сможем предложить альтернативный подход, который позволит выполнить то, что вам нужно.   -  person Charles Bretana    schedule 08.09.2016
comment
Хорошо, извините, я просто подумал, что будет чище, если я опубликую ссылку на imgur, поскольку копирование может быть довольно грязным и громоздким, особенно с учетом длины моего запроса.   -  person Azuraith    schedule 08.09.2016
comment
Возможный дубликат Как написать оператор select внутри case   -  person Shiva    schedule 08.09.2016
comment
Это немного другое, я хочу, чтобы оператор select находился в части THEN дела. не то когда.   -  person Azuraith    schedule 08.09.2016
comment
вы получаете какую-либо ошибку, помещая оператор select в часть случая Then?   -  person Kashif Qureshi    schedule 08.09.2016
comment
Нет, проблема в том, что он создает 4-й ряд. одна строка, которую я ожидал, добавляет информацию о подзапросе в соответствующую строку в зависимости от случая. Но тогда существует другая строка, идентичная этой, но содержащая значение NULL, где значение столбцов подзапроса находится в другом.   -  person Azuraith    schedule 08.09.2016
comment
Нажмите на мою ссылку imgur, чтобы увидеть, о чем я говорю.   -  person Azuraith    schedule 08.09.2016


Ответы (1)


Я нашел решение моей конкретной проблемы. это было просто мое предложение where, вызывающее добавление строк.

Но чтобы ответить на первоначальный вопрос, можете ли вы поместить оператор выбора подзапроса в CASE. Да, ты можешь сделать это.

CASE
   WHEN condition
   THEN (select column1, from tbl join tbl2 on tbl1.column = tbl2.column)

   ELSE 
    (whatever)

END
person Azuraith    schedule 08.09.2016