是否有可能在MySQL中执行这样的子查询?

时间:2014-02-22 11:28:00

标签: mysql sql

以下查询给出了一个错误:

select
  case 
    when exists (select username from table_name) 
      then concat('_username_', table_name)
    else table_name
  end
from information_schema.tables 
where table_schema = 'test'

如果表中包含名为“user-name”的列,我基本上想要返回_username_(the table name)

我意识到还有另一种方法可以通过选择information_schema.columns来做到这一点,但我会像上面那样(如果可能的话)这样做。

编辑:我希望我的查询获取数据库测试中的所有表。如果表具有列用户名,那么我希望它返回_username_(followed by table name),否则返回表名

2 个答案:

答案 0 :(得分:2)

是。左连接到columns

select 
    case when column_name is null then t.table_name
        else concat('_username_', t.table_name) end
from information_schema.tables t
left join information_schema.columns c on c.table_name = t.table_name
    and c.table_schema = t.table_schema
    and column_name = 'user-name'
where t.table_schema = 'test'

这里的要点是:

  • 列上的所有条件都必须在join子句中,因此允许左连接。请注意,在连接条件下“非键”条件是正常的 - 这个功夫值得记住,因为这是你可以在非键条件下使用左连接的唯一方法(如果你把它们放在where子句中它变成了内部联接)
  • 由于表中的列名是唯一的,因此将连接一行或不加行。如果没有连接,则连接的列将为null - 这是在case
  • 中测试的内容

最后,顺便说一句,最好不要使用破折号命名列,即username而不是user-name,否则每次使用时都必须将其删除。

答案 1 :(得分:1)

如果不加入表INFORMATION_SCHEMA.COLUMNS,则无法知道每个表的列。 试试这个问题:

SELECT 
CASE
WHEN C.COLUMN_NAME = 'username' THEN CONCAT('_username_',C.TABLE_NAME) ELSE C.COLUMN_NAME END
FROM INFORMATION_SCHEMA.TABLES T
JOIN INFORMATION_SCHEMA.COLUMNS C ON T.TABLE_NAME = C.TABLE_NAME AND T.TABLE_SCHEMA = C.TABLE_SCHEMA
WHERE T.TABLE_SCHEMA = 'test';