2012-09-24 7 views
5

私はMySQLテーブルからデータをマッピングしており、50以上の列と100,000以上の行を持つ表を持っています。に4文字以下のデータがある列をマップする必要があります。4文字以下のデータのみを含む表のすべての列を返すにはどうすればよいですか?

テーブル内の4文字以下のデータしか持たないすべての列のリストを取得するにはどうすればよいですか?私の場合、すべての列はvarchar(255)です。

+0

私の最初の提案はhttp://sqlfiddle.com/#!2/f3573/1だったが、もう一度あなたの質問を読んだ後、それは単純ではない;-) –

+0

申し訳ありませんが、私の元の質問は不明であった、私が編集しましたそれ以上。 –

+0

列名またはデータ? – Sami

答えて

0

これは、あなたの名前が4以下の文字が含まれている列与える:上記のSQLで

SHOW COLUMNS FROM table WHERE CHAR_LENGTH(Field) < 5 

をあなたは自分のテーブルの名前でtableを交換する必要があり、Fieldは、あなたがそのようにそれを維持しなければならないリテラルです。

UPDATE:
あなたが4つの以下の文字を持つ列の内容を望むなら、あなたはこのようにすることができます

select * from table where CHAR_LENGTH(column_name) < 5 
+0

ありがとう、それ自体では便利ですが、私は列の*名前*を意味するのではなく、列自体の*データ*を意味します。ターゲットソースには4文字以下のコードが必要な列があり、データをこの条件を満たす列を見つけることでこれを知的にマップする必要があります。 –

+0

[OK]を、私もそれをカバーする私の答えを更新しました。 – Nelson

+0

それはもっと解決策ですが、どういうわけか、テーブルからすべての列を取得し、各列のすべてのデータをチェックし、すべてのデータが4文字以下の基準を満たす場合にのみ列名を返す必要があります。 –

1
SELECT 
    COLUMN_NAME 

FROM INFORMATION_SCHEMA.COLUMNS 

WHERE TABLE_NAME = <table> 
AND CHAR_LENGTH(COLUMN_NAME) <= 4 
+0

ありがとうございましたが、私は列の*名前*を意味するのではなく、列自体の*データ*を意味しました。 –

0

を、私はあなたがINFORMATION_SCHEMA.COLUMNSからの情報を使用して動的クエリを作成する必要があると思いますそれを実行してください。テストされていませんが、次のようになります。

SET @s = 'SELECT GROUP_CONCAT(X) AS FOUR_CHAR_COLS, ID FROM (' + 
     (SELECT GROUP_CONCAT('SELECT CASE WHEN CHAR_LENGTH(`' + COLUMN_NAME + 
     '`) <= 4 THEN ''' + COLUMN_NAME + ''' ELSE NULL END AS X, ID FROM MyTableName' 
      SEPARATOR ' UNION ALL ') 
     FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE TABLE_NAME = 'MyTableName') + 
    ') XX GROUP BY ID'; 

PREPARE stmt FROM @s; 
EXECUTE stmt; 

これは、4文字以下の各行のすべての列をリストする必要があります。

0

ストアドプロシージャを使用して行うことができます。

  1. 表とストアの重要なすべての列名を一時表に選択します。
  2. WHILEまたはREPEATループを反復し、SELECT LENGTH(column_name)FROMテーブルを実行します。