【问题标题】:Concatenate two columns conditionally有条件地连接两列
【发布时间】:2018-07-18 07:16:12
【问题描述】:

我有一个名为 table_1 的 MySQL 表:

mysql> select * from table_1;
+----------+-----------+----------+-------+
| col_1    | col_2     | col_3    | col_4 |
+----------+-----------+----------+-------+
|      123 | ABCD      | TTTTT    |     3 |
|    46542 | ABCD/HIJ  | AAAAAAAA |     9 |
|       23 | ABCDEFGH  | CCC      |    45 |
|     5675 | ABCD/HIJ  | NNNN     |     0 |
|    65165 | NJFD      | QQQQ     |     0 |
|   165464 | NULL      | HHH      |     8 |
| 16546541 | ABCABC    | LLLLLL   |     0 |
|   764316 | ABCD/BBJH | NULL     |     3 |
|     3125 | NULL      | EEEEEE   |    91 |
+----------+-----------+----------+-------+
9 rows in set (0.00 sec)

DDL:

CREATE TABLE IF NOT EXISTS table_1 (
  col_1 INT(11) NOT NULL,
  col_2 VARCHAR(45) DEFAULT NULL,
  col_3 VARCHAR(10) DEFAULT NULL,
  col_4 INT(11) NOT NULL
);

插入数据:

INSERT INTO table_1(col_1,col_2,col_3,col_4)
VALUES (123,'ABCD','TTTTT',3),
       (46542,'ABCD/HIJ','AAAAAAAA',9),
       (23,'ABCDEFGH','CCC',45),       
       (5675,'ABCD/HIJ','NNNN',0),
       (65165,'NJFD','QQQQ',0),
       (165464,NULL,'HHH',8),
       (16546541,'ABCABC','LLLLLL',NULL),
       (764316,'ABCD/BBJH',NULL,3),
       (3125,NULL,'EEEEEE',91);

我想要做的是选择 col_1 和一个新的 MySQL 生成的第二列,比如 col_new。

  1. 如果 col_2 为 NULL,则 col_new 也应为 NULL。
  2. 如果 col_2 不为 NULL 但 col_3 为 NULL,则 col_new 也应为 NULL。
  3. 如果 col_2 和 col_3 都不是 NULL,则 col_new 应该与 col_3 相同。
  4. 在 3 中有一个特殊情况。如果 col_2 和 col_3 都不是 NULL 并且 col_3 = 'CCC' 那么 col_new 应该是 concat(col_3, 'v', col_4) 在这种情况下应该是 'CCCv45'。

我知道我将不得不使用concat,例如:select col_1, concat(col_3, 'v', col_4) from table_1

但是我怎样才能实现上述所有 4 个条件呢?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    编写 CASE 表达式的另一种方法是:

    select t.*,
        case when col_2 is null then null
             when col_3='CCC' then concat(col_3, 'v', col_4)
             else col_3
        end as new_col2     
    from table_1 t
    

    【讨论】:

      【解决方案2】:
      SELECT col_1, 
      CASE 
      WHEN (col_2 IS NULL) OR (col_2 IS NOT NULL AND col_3 IS NULL) THEN NULL
      WHEN col_2 IS NOT NULL AND col_3 = 'CCC' THEN concat(col_3, 'v', col_4)
      WHEN col_2 IS NOT NULL AND col_3 IS NOT NULL THEN col_3
      END
      FROM table_1
      

      http://sqlfiddle.com/#!9/eb2550/5

      解决方案 2

      SELECT 
          col_1, 
          IF(
              (col_2 IS NULL) 
              OR (
                  col_2 IS NOT NULL 
                  AND col_3 IS NULL
              ), 
              NULL, 
              (
                  IF(
                      col_2 IS NOT NULL 
                      AND col_3 = 'CCC', 
                      concat(col_3, 'v', col_4), 
                      col_3
                  )
              )
          ) 
      FROM 
          table_1
      

      http://sqlfiddle.com/#!9/eb2550/9

      【讨论】:

      • 谢谢“Razvan Socol”和“Shamkhal Maharramov”。您的解决方案给了我预期的结果。我只能将一个标记为答案,因此我将 Razvan Socol 的回复标记为干净且更早的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2015-01-01
      相关资源
      最近更新 更多