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

MySQLでの列値の交換

    私は同じことに対処する必要がありました。調査結果を要約します。

    1. UPDATE table SET X=Y, Y=X 両方の値をYに設定するだけなので、アプローチは明らかに機能しません。

    2. 一時変数を使用するメソッドは次のとおりです。 http://beerplaのコメントからAntonyに感謝します.net / 2009/02/17 / swapping-column-values-in-mysql / 「ISNOTNULL」の調整用。これがないと、クエリは予期せず機能します。投稿の最後にあるテーブルスキーマを参照してください。このメソッドは、値の1つがNULLの場合、値を交換しません。この制限がない方法#3を使用してください。

      UPDATE swap_test SET x=y, [email protected] WHERE (@temp:=x) IS NOT NULL;

    3. このメソッドは、Dipinによって提供されましたが、 http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/ 。これが最もエレガントでクリーンなソリューションだと思います。 NULL値と非NULL値の両方で機能します。

      UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;

    4. 私が思いついた別のアプローチはうまくいくようです:

      UPDATE swap_test s1, swap_test s2 SET s1.x=s1.y, s1.y=s2.x WHERE s1.id=s2.id;

    基本的に、1番目のテーブルは更新されるテーブルであり、2番目のテーブルは古いデータをプルするために使用されます。
    このアプローチでは主キーが存在する必要があることに注意してください。

    これは私のテストスキーマです:

    CREATE TABLE `swap_test` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `x` varchar(255) DEFAULT NULL,
      `y` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB;
    
    INSERT INTO `swap_test` VALUES ('1', 'a', '10');
    INSERT INTO `swap_test` VALUES ('2', NULL, '20');
    INSERT INTO `swap_test` VALUES ('3', 'c', NULL);
    


    1. Oracleclob列で特定の文字列を検索します

    2. MySQLのパフォーマンス:長いクエリの識別

    3. OBJECTPROPERTY()を使用して、SQLServerのテーブルにTIMESTAMP列があるかどうかを確認します。

    4. MySQLに保存するためにIPv6をバイナリから変換する方法