首頁 >資料庫 >mysql教程 >如何使用準備好的語句在 SQL 中動態轉置表?

如何使用準備好的語句在 SQL 中動態轉置表?

Susan Sarandon
Susan Sarandon原創
2025-01-06 03:58:40746瀏覽

How to Dynamically Transpose a Table in SQL Using Prepared Statements?

如何使用動態 SQL 轉置表

在 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn