使用多个表时,任务是检查表是否存在以及是否存在某些列。
查询
SELECT
(TABLE_NAME) AS table_name,
(GROUP_CONCAT(COLUMN_NAME)) AS column_name
FROM information_schema.COLUMNS
WHERE
TABLE_SCHEMA = 'dbms'
AND
TABLE_NAME IN ('user', 'status')
AND
COLUMN_NAME IN ('id', 'name')
GROUP BY table_name
可以正常检测现有列,但如果任何一个表不存在或者没有列存在,则不返回任何内容。 后者应该有所区别。 如何? 如何知道它是不存在的表名还是列名?
为了澄清,上面的查询将返回2行2列:
user | id, name
status | id, name
表示每个表都有两列。
将一个列名更改为,例如,name1,将导致:
user | id
status | id
表示只存在id。
将列名更改为name1,id1将不返回任何内容。 这就是问题。无法说明表格是否存在或列。
如果回报看起来像是这样的话会很好:
user | ''
status | ''
如果,状态不存在,那么就像:
user | ''
可以解码的内容只有用户表存在,而且没有在其中命名的列。
答案 0 :(得分:1)
您不能将WHERE
用于column_name,即使它们不匹配,您仍然希望结果集中包含行。看起来你想要的唯一真正的WHERE
子句基于表名,而列名只是一个显示条件。
SELECT
table_name
GROUP_CONCAT(IF(column_name IN ('id','name'), column_name, NULL))
FROM information_schema.columns
WHERE table_schema = 'dbms'
AND table_name IN ('user','status')
GROUP BY table_name
答案 1 :(得分:-1)
你只需要改变逻辑和条件,如查询中所述TABLE_SCHEMA ='dbms' 和 TABLE_NAME IN('用户','状态') 和 COLUMN_NAME IN('id','name')
如果在dbms中存在具有列名id或名称的表用户或状态,它将仅获取结果集, 您可以做的是单独检查表格,如果表格存在则检查列。我希望它会有所帮助