【问题标题】:Same Column check in SQL Server insertSQL Server 插入中的相同列检查
【发布时间】:2016-06-17 17:36:26
【问题描述】:

我有一张表dom 包含这两列(FLAT_AMOUNTFLAT_PERCENTAGE)。

我要往表中插入数据dom

INSERT INTO Dom(FLAT_AMOUNT, FLAT_PERCENTAGE)
    SELECT 
        CASE
           WHEN FLAT_PERCENTAGE = 0 THEN 0
        END AS FLAT_AMOUNT,
        CASE
           WHEN PN_TYPE = 'AD' THEN 0
           WHEN PN_TYPE = 'OD' THEN 1
           WHEN PN_TYPE IN('SB', 'FP', 'AM', 'G') THEN 2
           ELSE 0
        END AS FLAT_PERCENTAGE
    FROM
        PENNUM 

我希望你明白我的意思。有没有办法检查表中相同的列值以插入其他列?

【问题讨论】:

  • Domnic 你的 select 语句缺少 FROM 子句,它也缺少第一个 case 语句后的逗号(我为你插入它)。您能否提出您的问题,我或许可以为您提供帮助。
  • 我已经编辑了脚本请检查

标签: sql sql-server-2008 sql-server-2005


【解决方案1】:

如果我正确理解了您的问题,这就是您想要做的:

INSERT INTO    Dom(FLAT_AMOUNT
              , FLAT_PERCENTAGE)
      SELECT CASE
               WHEN FLAT_PERCENTAGE = 0 THEN 0
            END AS FLAT_AMOUNT
          , CASE
               WHEN PN_TYPE = 'AD' THEN 0
               WHEN PN_TYPE = 'OD' THEN 1
               WHEN PN_TYPE IN('SB', 'FP', 'AM', 'G') THEN 2
               ELSE 0
            END AS FLAT_PERCENTAGE
      FROM   PENNUM AS A
            LEFT OUTER JOIN Dom AS B ON CASE
                                     WHEN A.PN_TYPE = 'AD' THEN 0
                                     WHEN A.PN_TYPE = 'OD' THEN 1
                                     WHEN A.PN_TYPE IN('SB', 'FP', 'AM', 'G') THEN 2
                                     ELSE 0
                                  END = B.FLAT_PERCENTAGE
                                  AND CASE
                                        WHEN A.FLAT_PERCENTAGE = 0 THEN 0
                                     END = B.FLAT_PERCENTAGE
      WHERE  B.FLAT_AMOUNT IS NULL
            AND B.FLAT_PERCENTAGE IS NULL;

【讨论】:

    【解决方案2】:

    如果我理解正确,您可以重复逻辑:

    INSERT INTO Dom(FLAT_AMOUNT,FLAT_PERCENTAGE)
      SELECT (CASE WHEN PN_TYPE NOT IN ('OD', 'SB', 'FP', 'AM', 'G') THEN 0
              END) AS FLAT_AMOUNT,
             (CASE WHEN PN_TYPE = 'AD' THEN 0
                   WHEN PN_TYPE = 'OD' THEN 1
                   WHEN PN_TYPE IN('SB', 'FP', 'AM', 'G') THEN 2
                   ELSE 0
              END) AS FLAT_PERCENTAGE
        FROM PENNUM ;
    

    或者,您可以使用子查询、CTE 甚至 outer apply,这样您的查询就不必重复逻辑:

    INSERT INTO Dom(FLAT_AMOUNT,FLAT_PERCENTAGE)
      SELECT (CASE WHEN x.FLAT_PERCENTAGE = 0 THEN 0
              END) AS FLAT_AMOUNT,
             x.FLAT_PERCENTAGE
        FROM PENNUM p OUTER APPLY
             (SELECT (CASE WHEN p.PN_TYPE = 'AD' THEN 0
                           WHEN p.PN_TYPE = 'OD' THEN 1
                           WHEN p.PN_TYPE IN ('SB', 'FP', 'AM', 'G') THEN 2
                           ELSE 0
                      END) as FLAT_PERCENTAGE
             ) x;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多