sql >> データベース >  >> RDS >> Mysql

可変列名のMySQL選択クエリ

    最も簡単な解決策は、2つの別々のクエリを使用することです。

    最初のクエリの結果を使用して、2番目のクエリのSQLテキストを動的に生成します。

    mysql> SET @colname := '' ; 
    mysql> SELECT t.rslt FROM table1 t WHERE t.id = 1 ORDER BY t.rslt LIMIT 1 INTO @colname ;
    
    mysql> SET @sql := CONCAT('SELECT `',@colname,'` FROM table2 ORDER BY 1') ;
    mysql> PREPARE stmt FROM @sql ; 
    mysql> EXECUTE stmt ;
    
    mysql> DEALLOCATE PREPARE stmt ;
    

    N.B. @colnameを含む SQLテキストの一部として、動的に準備されたSQLは、潜在的なSQLインジェクションの脆弱性です。

    シングルのコンテキストで同様のことを行う必要がある場合 SQLステートメントの場合、ステートメントは、table1からのクエリに対して返される可能性のある値を予測し、table2からの可能性のある列への明示的な参照を含める必要があります。たとえば、次のようになります。

      SELECT CASE ( SELECT t.rslt FROM table1 t WHERE t.id = 1 LIMIT 1 )
               WHEN 'r1' THEN r.r1 
               WHEN 'r2' THEN r.r2 
               WHEN 'r3' THEN r.r3 
               ELSE NULL
             END AS c2
        FROM table2 r
       ORDER BY ...
    

    これは必ずしもクエリを作成するための最も効率的な方法ではありませんが、パターンを示しています。

    SQLステートメント内で、識別子(テーブル名、列名、関数名)を明示的に指定する必要があります。これらは、実行時に動的に導出することはできません。これは、SQLステートメントの処理方法が原因です...構文のSQLテキストを解析し、次にセマンティクス(有効な参照と特権)を解析し、使用可能なアクセスパスの相対コストを評価し、実行プランを選択して、そのプランを実行します。

    つまり、このSQLで観察される動作は、私たちが期待するものです。

     SELECT (SELECT rslt FROM table1 WHERE id = 1) FROM table2
    

    SQLテキストが準備され、実行時に、table2の各行に対して、SELECTのサブクエリが作成されます。 リストが実行されます。サブクエリがスカラー値を返す場合、スカラー値は外部クエリの列として返されます。サブクエリによって返される値はです。 、列名として評価されません(評価できません)。



    1. MySQL-Pythonで文字列ごとに複数のクエリを実行する方法はありますか?

    2. MySQLのsourceコマンドを使用してWindowsに大きなファイルをインポートするにはどうすればよいですか

    3. mysqlテーブル名でのワイルドカードの使用

    4. psycopgを使用した挿入の問題