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
)
答案 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)