从另一列中保存的列中进行选择

时间:2013-11-24 13:12:54

标签: mysql sql calculated-columns

create tableA (id int(11),col varchar(30) null)

 id          col
 1           NULL
 2           NULL
 3           other_col_name

现在我要做的是inner join和另一张桌子。所以当 col为NULL然后我将选择 t2.normal_col 如果它不是null,请选择“col”中输入的列。所以在这种情况下,我会选择 t2.other_col_name

这是我尝试过的,我知道它只会返回t1.col列中的输入而不是选择它。

SELECT COALESCE(t1.col, t2.normal_col) AS FROM tableA t1
INNER JOIN table2 ON t1.id= t2.id

你会怎么做?

修改;

table2
(
 int id,
 normal_col_name varchar(30) null, 
 other_col_name varchar(30) null,
 another_col varchar(30) null
)

2 个答案:

答案 0 :(得分:2)

我看到的唯一合理的方法是编写一个视图,可以垂直扩展模式,而不是水平扩展第二个表。您可以使用table2的元数据动态创建视图,也可以手动创建视图。如果您需要更快的解决方案,则可能必须创建另一个具有该结构并保持同步的物理表。您可以使用触发器来确保table1EAV上的所有操作都将被复制。

E.g。

id col1 col2
------------
1  a    b

会变成:

id col  value
-------------
1  col1 a
1  col2 b
1  id   1

使用类似的东西:

CREATE VIEW vTable2EAV
AS
SELECT id, 'id' AS col, (SELECT id FROM table2 WHERE id = t.id) AS [value]
FROM table1 t
UNION ALL
SELECT id, 'col1', (SELECT col1 FROM table2 WHERE id = t.id) AS [value]
FROM table1 t
UNION ALL
SELECT id, 'col2', (SELECT col2 FROM table2 WHERE id = t.id) AS [value]
FROM table1 t;

然后你的select语句如下:

SELECT 
    (
        SELECT [value] 
        FROM vTable2EAV
        WHERE 
            id = table2.id 
            AND [col] = IFNULL(t1.col, 'normal_col')
    ) AS col_value,
    t2.some_other_t2_column
FROM table1 t1
INNER JOIN table2 t2 ON t2.id = t1.id;

答案 1 :(得分:2)

在正常设计中无法做到这一点。但您可以使用 EAV (entity-attribute-value) 设计。在这样的设计中你的表2:

id    normal_col_name    other_col_name     another_col 
-------------------------------------------------------
1     a                  b                  c
2     d                  e                  f 

看起来像那样

entity    attribute          value
----------------------------------
1         normal_col_name    a
1         other_col_name     b
1         another_col_name   c
2         onormal_col_name   d        
2         other_col_name     e      
2         another_col_name   f

当然,在这样的设计中,查询会更复杂,但您想要的实际上非常简单:

select id, value
from tableA
    join EAV on id = entity and attribute = if(col is NULL, 'normal_col', col)