在 SQL 中,轉置表涉及將面向行的表轉換為面向列的表。這對於各種場景都很有用,例如建立使用者摘要報告。
在 SQL 中實作轉置的一種方法是使用 CASE 語句。考慮一個包含以下列的表:Id、UserId、FieldName 和 FieldValue,如提供的範例所示。
SELECT t.userid, MAX(CASE WHEN t.fieldname = 'Username' THEN t.fieldvalue ELSE NULL END) AS Username, MAX(CASE WHEN t.fieldname = 'Password' THEN t.fieldvalue ELSE NULL END) AS Password, MAX(CASE WHEN t.fieldname = 'Email Address' THEN t.fieldvalue ELSE NULL END) AS Email FROM t GROUP BY t.userid
此查詢將傳回轉置結果,按 UserId 對使用者進行分組,並將對應的欄位值指派給使用者名稱、密碼和電子郵件地址列。
但是,這種方法需要為每個欄位定義 CASE 語句,這可能很乏味且不靈活。若要使其動態化,您可以利用 MySQL 的準備語句(動態 SQL)語法。
SET @sql = CONCAT("SELECT userid"); -- Dynamically create the field selection part SET @field_list = ( SELECT GROUP_CONCAT( CONCAT('MAX(CASE WHEN t.fieldname = ''', fieldname, ''' THEN t.fieldvalue ELSE NULL END) AS ', fieldname) ) FROM t GROUP BY userid ); SET @sql = CONCAT(@sql, ", ", @field_list); SET @sql = CONCAT(@sql, " FROM t GROUP BY userid"); PREPARE stmt FROM @sql; EXECUTE stmt;
此查詢使用子查詢的結果建構動態 SQL 語句來決定欄位選擇部分。它使用 GROUP_CONCAT 函數連接 CASE 語句,確保動態建構的 SQL 查詢有效。
透過使用動態 SQL,您可以避免手動定義 CASE 語句並保留靈活性,允許您的查詢處理任意數量的 CASE 語句使用者定義欄位。
以上是如何使用準備好的語句在 SQL 中動態轉置表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!