【问题标题】:Is it possible to put a select statement in a case statement?是否可以将 select 语句放在 case 语句中?
【发布时间】:2017-01-16 14:44:53
【问题描述】:

我目前正在尝试在我的 select 语句中使用 select 语句。到目前为止,效果很好。但我希望它根据某些条件选择不同的东西。我的问题是将 SQL 语句子查询放在 CASE 语句的 THEN 部分而不是 WHEN 部分。所以我的例子是here。所以我想在 CASE 语句中放置一个 select 语句,该语句全部包含在子查询中。我也在使用 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'; 

这就是我现在所拥有的,但出于某种原因,我的案例为我的 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';

【问题讨论】:

  • 底线,不,你不能,但如果你将 SQL 语句粘贴到问题中,我相信我们可以建议一种替代方法来完成你所追求的。
  • 好吧,抱歉,我只是认为如果我发布一个 imgur 链接会更干净,因为复制粘贴可能非常混乱和麻烦,尤其是我的查询长度。
  • 这有点不同,我想要案例的 THEN 部分中的 select 语句。不是什么时候。
  • 在案例的 Then 部分添加 select 语句是否有任何错误?

标签: sql sql-server-2008 select case-statement


【解决方案1】:

我找到了解决我的具体问题的方法。这只是我的 where 子句导致添加的行。

但是要回答您能否在 CASE 中放置子查询选择语句的原始问题。是的,你可以做到。

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

   ELSE 
    (whatever)

END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 2021-09-05
    相关资源
    最近更新 更多