在MYSQL中忽略空值的最佳方法

在MYSQL中忽略空值的最佳方法,mysql,sql,Mysql,Sql,我的数据是这样的 我在表字段中有多个值,每个值在数据字段中都有自己的唯一值。但是,表A的数据值将与表myTable中的格式相同。这同样适用于表字段中的所有记录 我使用JSON_EXTRACT结合CASE语句获取值 SELECT CASE WHEN Table = 'table A' THEN CONCAT_WS('\n','Name: ', JSON_EXTRACT(Data

我的数据是这样的

我在表字段中有多个值,每个值在数据字段中都有自己的唯一值。但是,表A的数据值将与表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。

选项一:

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    

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

注意:您必须了解这些不是数据库中的实际空值,而是因为您的要求是读取行并将其转换为列,因此最终结果中的每一行对于除相应派生列以外的所有列都将具有空值一我们可以在查询中的每一列、每种情况下使用max

你可以试试下面的

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 

我认为您只需要条件聚合:

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:


where?@Sujitmohanty30中的空值如中所示,如果未遇到tableA,则会将tableA字段显示为空,这与预期一致。我想知道是否有另一种通过避免为空来提取数据的方法。如果我理解您的意思,那么这不只是为了添加表不为空的位置吗?显示您现在得到的结果的示例,并显示您想要的结果的示例。@Ayubx-我已经发布了我的解决方案。谢谢你。我正在测试选项1,但仍然得到空值。我正在检查为什么使用自动取款机。我确信您已经理解了我在示例中提供的不止两行。其他行具有不同的TableTable字段,但如前所述,一个表在整个表中具有相同的数据字段格式。
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;