0

表名称:查找字段名称:查找 示例字段名称值:
Country.CountryCode

在表“Look”内进行选择时,我应该动态拆分字段名“LookUp”的值,并将第一个值作为表名,将第二个值作为字段名以进行动态选择。我有 split 功能,问题是如何使它在 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 
4

1 回答 1

0

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

以前的类似问题:-

在 LEFT JOIN 中使用变量作为表名的 MYSQL 查询

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

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 从您想要的那个中返回字段。

但是,如果您被迫这样做,那么我建议您尽早重新设计数据库。

于 2013-04-15T12:05:16.837 回答