2016-09-08 7 views
1

私は現在、selectステートメント内でselectステートメントを使用しようとしています。これまでのところ素晴らしいです。しかし、私はそれがいくつかの条件によって異なるものを選択したい。私の問題は、WHEN部分ではなく、CASE文のTHEN部分にSQL文サブクエリを置くことです。だから私の例はhereです。だから私はすべてのサブクエリでwrapedされているCASE文の中にselect文を配置したい。また、私はここではSQL Server 2008のselect文をcase文に入れることはできますか?

を使用していますことは、私が元々持っていたものです:

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'; 

これは私が今持っているものであるが、いくつかの理由で私の場合は私の3行の結果に4行目を作成しました:

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'; 
+0

ボトムラインは、いいえ、あなたがすることはできませんが、あなたは質問にSQL文を貼り付ける場合、私たちはあなたが後にあるものを達成する別のアプローチを提案することができます確信しています。 –

+0

申し訳ありませんが、コピー貼り付けが非常に面倒で扱いにくい場合があるので、特に私のクエリの長​​さでは、私はimgurリンクを投稿した方がクリーンであると思っていました。 – Azuraith

+0

[ケース内の選択ステートメントを書く方法]の複製があります(http://stackoverflow.com/questions/25767993/how-to-write-a-select-inside-case-statement) – Shiva

答えて

1

私の特定の問題の解決策を見つけました。追加された行を引き起こすのはちょうど私のwhere節でした。

しかし、元の質問に答えるには、CASEにサブクエリ選択ステートメントを入れます。はい、できます。

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

    ELSE 
    (whatever) 

END 
関連する問題