【问题标题】:MySQL Case Function combine with NOT IN FunctionMySQL Case 函数与 NOT IN 函数相结合
【发布时间】:2022-01-19 18:01:20
【问题描述】:
CREATE TABLE tree (
  `id` INTEGER,
  `p_id` VARCHAR(4)
);

INSERT INTO tree
  (`id`, `p_id`)
VALUES
  ('1', null),
  ('2', '1'),
  ('3', '1'),
  ('4', '2'),
  ('5', '2');

CREATE TABLE Result (
  `id` INTEGER,
  `Type` VARCHAR(5)
);

INSERT INTO Result
  (`id`, `Type`)
VALUES
  ('1', 'Root'),
  ('2', 'Inner'),
  ('3', 'Leaf'),
  ('4', 'Leaf'),
  ('5', 'Leaf');

SELECT
    id
    ,CASE
        WHEN p_id is NULL THEN 'Root'
        WHEN id IN (
                    SELECT p_id 
                    FROM tree) 
        THEN 'INNER'
        WHEN id NOT IN(
                       SELECT p_id
                       FROM tree)
        THEN 'LEAF'
        END AS Type
FROM tree

返回

id  Type                                                                                            
1   Root                                                                                                             
2   INNER                                                                                                    
3   null                                                                                          
4   null                                                                                          
5   null   

优先退货

1   Root                                                                                                             
2   INNER                                                                                                    
3   LEAF                                                                                          
4   LEAF                                                                                          
5   LEAF  

我也能得到任何建议,哪个函数可以与 MySQL 函数中的 case 函数一起使用

【问题讨论】:

  • SELECT id ,CASE WHEN p_id 为 NULL THEN 'Root' WHEN id IN (SELECT p_id FROM tree) THEN 'INNER' # WHEN id NOT IN(# SELECT p_id # FROM tree) # THEN 'LEAF ' ELSE 'lEAF' END AS Type FROM tree
  • 我已经搭建好了模板测试平台,你可以看看db-fiddle.com/f/bv7cf7TdJs71aTsjsgHorp/0
  • 为什么是p_id VARCHAR 而不是INTEGER
  • Result 表和这个问题有什么关系?
  • p_id 是 parent_id ,后面可能是 sting 类型所以设置在 varchar 中,结果是测试用例的欲望表

标签: mysql sql


【解决方案1】:

你可以这样做:

select distinct t.*,case when t.p_id is null then 'root' 
                         when p.p_id is null then 'leaf' 
                         else 'inner' 
                    end as type
from tree t 
left join tree p on p.p_id = t.id 

db小提琴here

【讨论】:

    【解决方案2】:

    更改NOT IN 子查询以过滤掉p_id = NULL,因为当您与之比较时,您会得到NULL

    SELECT
        id
        ,CASE
            WHEN p_id is NULL THEN 'Root'
            WHEN id IN (
                        SELECT p_id 
                        FROM tree) 
            THEN 'INNER'
            WHEN id NOT IN (
                        SELECT p_id 
                        FROM tree
                        WHERE p_id IS NOT NULL) 
            THEN 'LEAF'
            END AS Type
    FROM tree
    

    DEMO

    但是,我实际上建议您在@eshirvana 的答案中使用LEFT JOIN 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 2021-08-19
      相关资源
      最近更新 更多