MySql动态选择

时间:2013-04-15 11:48:55

标签: mysql stored-procedures

表名:看
FieldName:LookUp
示例fieldname值:Country.CountryCode

在选择内部表'Look'时,我应该动态地拆分字段名'LookUp'的值,并将第一个值作为Tablename,将第二个值作为Fieldname来进行动态选择。我有分离功能,问题是如何使它在case语句中工作,或者可能有人有另一种解决方案。目前我有这个显然不起作用

SELECT l.Id,
  case when l.lookup is not null then
      SELECT t.Id
      FROM (SPLIT_STR(l.LOOKUP,'.',1)) AS t 
      WHERE t.(SPLIT_STR(l.LOOKUP,'.',2)) = l.attValue
      LIMIT 1
  END AS attValue
FROM look as l 

1 个答案:

答案 0 :(得分:0)

不要相信可以从字段中获取表名。是否表示您的数据库设计存在问题。

以前的类似问题: -

MYSQL query using variable as table name in LEFT JOIN

如果要加入的相关表格/字段数量有限且您事先知道它们,则可能会执行以下操作: -

SELECT l.Id, 
CASE 
    WHEN SPLIT_STR(l.LOOKUP,'.',1) = 'tableA' THEN tableA.Id 
    WHEN SPLIT_STR(l.LOOKUP,'.',1) = 'tableB' THEN tableB.Id 
    WHEN SPLIT_STR(l.LOOKUP,'.',1) = 'tableC' THEN tableC.Id 
    WHEN SPLIT_STR(l.LOOKUP,'.',1) = 'tableD' THEN tableD.Id 
    ELSE NULL
END AS SubId
FROM look as l 
LEFT OUTER JOIN tableA ON tableA.ColA = l.attValue
LEFT OUTER JOIN tableB ON tableA.ColB = l.attValue
LEFT OUTER JOIN tableC ON tableA.ColC = l.attValue
LEFT OUTER JOIN tableD ON tableA.ColD = l.attValue

即,加入每个可能的子表并使用CASE返回所需的字段。

但是,如果你做到这一点,那么我建议你尽早重新设计数据库。