简体   繁体   English

有条件地连接两列

[英]Concatenate two columns conditionally

I have MySQL table named table_1 : 我有一个名为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: 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 data: 插入数据:

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

What I want to do is select col_1 and a new MySQL generated second column, say col_new. 我要选择的是col_1,然后是新的MySQL生成的第二列,例如col_new。

  1. If col_2 is NULL then col_new should be NULL as well. 如果col_2为NULL,则col_new也应为NULL。
  2. If col_2 is NOT NULL but col_3 is NULL then col_new should be NULL as well. 如果col_2为NOT NULL,但col_3为NULL,则col_new也应为NULL。
  3. If both col_2 and col_3 are NOT NULL then col_new should be same as col_3. 如果col_2和col_3都不为空,则col_new应该与col_3相同。
  4. There is a special case in 3. If both col_2 and col_3 are NOT NULL and col_3 = 'CCC' then then col_new should be concat(col_3, 'v', col_4) which in this case should be 'CCCv45'. 在3中有一个特殊情况。如果col_2和col_3都不为NULL并且col_3 ='CCC',则col_new应该为concat(col_3, 'v', col_4) ,在这种情况下应为'CCCv45'。

I know I'll have to use concat like: select col_1, concat(col_3, 'v', col_4) from table_1 我知道我必须像使用concatselect col_1, concat(col_3, 'v', col_4) from table_1

But how can I implement all the 4 conditions above? 但是如何实现上述所有四个条件?

Another way to write the CASE expression would be: 编写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
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 http://sqlfiddle.com/#!9/eb2550/5

Soltution 2 解决方案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 http://sqlfiddle.com/#!9/eb2550/9

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM