2014-02-22 66 views
0

下面的查詢給我一個錯誤:是否可以在MySQL中做這樣的子查詢?

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' 

我基本上要返回_username_(the table name)如果表中包含一個名爲「用戶名」欄。

我知道還有另一種方法可以通過選擇information_schema.columns來做到這一點,但我已經像上面那樣做了(如果可能的話)。

編輯:我想我的查詢獲取數據庫測試中的所有表。如果表有列用戶名,那麼我希望它返回_username_(followed by table name),否則返回表名

+0

更改您希望能夠從查詢中完成的問題。 – Layke

+0

@Strawberry爲什麼複製?這裏提出的問題與您提供的鏈接中提出的問題不同。 –

回答

2

是的。 LEFT JOIN到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' 

這裏的要點是:

  • 所有在列的條件必須是參加子句中,所以左聯接是允許的。注意,在一個連接條件中「非關鍵」條件是可以的 - 這個功夫是值得記住的,因爲這是你可以使用非關鍵條件的左連接的唯一方式(如果你把它們放在where子句中它變成一個內部聯接)
  • 由於表內的列名是唯一的,因此將會有一行或無行加入。如果沒有加入,加入的列將是空的 - 那正是在case

被測試的最後,順便說一句,這將是更好的命名列沒有破折號,即usernameuser-name,否則你每次使用它都必須逃脫它。

+0

我不明白'LEFT JOIN'的原因。是否有一個表的列名被標記爲NULL的情況? –

+0

謝謝,正是我所需要的。我相信如果「AND column_name ='username'」列名沒有用戶名 – Jason

+0

@AlbertoSolano否 - 列名永遠不爲空,但如果列不存在*連接行*將會有每列中都爲空。看到註釋添加到回答 – Bohemian

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'; 
+0

-1這實際上會爲每個表中的每個*列*賦予一行,但是OP希望每個表*有一行*。 – Bohemian

+0

@波希米亞在哪裏寫'每桌一行'?他只是寫道:'我想讓我的查詢獲得數據庫測試中的所有表格。'然後'我希望它返回_username_(後跟表名)否則返回表名'。 –

+0

很明顯,他希望每張表有一行,否則列名肯定會出現在輸出 – Bohemian