sql—在mysql中忽略空值的最佳方法

vuv7lop3  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(426)

我的数据是这样的,

我在表字段中有多个值,每个值的数据字段都有自己的唯一值。但是,tablea的数据值与mytable表中的格式相同。这同样适用于表字段中的所有记录。
我正在使用 JSON_EXTRACT 结合 CASE 声明。

SELECT
 CASE
        WHEN
            Table = 'table A'
        THEN
            CONCAT_WS('\n','Name: ',
                    JSON_EXTRACT(Data, '$.name'))
    END AS 'tableA',
CASE
        WHEN
            Table = 'table B'
        THEN
            CONCAT_WS('\n','Location: ',
                    JSON_EXTRACT(Data, '$.fieldType'))
    END AS 'tableB' from myTable

问题是我会得到空值。
我得到以下结果,

我期待以下结果,

我想避免空值。有没有其他方法提取数据?我正在使用mysql。

f2uvfpb9

f2uvfpb91#

方案一:

Select * 
from ( SELECT CASE WHEN Table_c = 'table A' THEN
                        CONCAT_WS('\n','Name: ', JSON_EXTRACT(data_c, '$.name'))
              END AS 'TableA'
       from test_t) A,
     ( SELECT CASE WHEN Table_c = 'table B' THEN
                        CONCAT_WS('\n','Location: ', JSON_EXTRACT(data_c, '$.fieldType'))
              END AS 'TableB'
       from test_t) B
where TableA is not null 
and TableB is not null

方案二:

SELECT CASE WHEN Table_c = 'table B' THEN
                 CONCAT_WS('\n','Location: ', JSON_EXTRACT(data_c, '$.fieldType'))
            ELSE
                 CONCAT_WS('\n','Name: ', JSON_EXTRACT(data_c, '$.name'))
       END AS 'Data'
       , CASE WHEN Table_c = 'table B' THEN
                 'Table B'
            ELSE
                 'Table A'
         END AS 'Table'
from test_t

这是演示
请注意,我在演示中更改了表和列的名称。

pzfprimi

pzfprimi2#

我想你只需要条件聚合:

SELECT MAX(CASE WHEN Table = 'table A'
                THEN CONCAT_WS('\n', 'Name: ', JSON_EXTRACT(Data, '$.name'))
           END) AS tableA,
       MAX(CASE WHEN Table = 'table B'
                THEN CONCAT_WS('\n','Location: ', JSON_EXTRACT(Data, '$.fieldType'))
           END) AS tableB
from myTable;

如果json中可能有多个匹配项,那么您可能需要 GROUP_CONCAT() 取而代之的是:

SELECT GROUP_CONCAT(CASE WHEN Table = 'table A'
                         THEN CONCAT_WS('\n', 'Name: ', JSON_EXTRACT(Data, '$.name'))
                    END) AS tableA,
       GROUP_CONCAT(CASE WHEN Table = 'table B'
                         THEN CONCAT_WS('\n','Location: ', JSON_EXTRACT(Data, '$.fieldType'))
                    END) AS tableB
from myTable;
a8jjtwal

a8jjtwal3#

注意:您必须了解这些不是数据库中的实际空值,而是因为您的要求是读取行并将其转换为列,因此最终结果中的每一行对于除相应派生列以外的所有列都将具有空值。我们可以在每一列上使用max(每个“case”与您的查询相同)。
你可以在下面试试,

SELECT MAX(IF(data_type = 'TableA', CONCAT_WS('\n', 'Name: ', 
                                           JSON_EXTRACT(data, '$.name')) 
           , '')) 
       TableA, 
       MAX(IF(data_type = 'TableB', CONCAT_WS('\n', 'Location: ', 
                                        JSON_EXTRACT(data, '$.fieldType')), '')) 
       TableB 
FROM   mytable

相关问题