0

mySQL 選択クエリで整数をテキストに変換したいと考えています。テーブルは次のようになります。

Languages
--------
1,2,3

各整数を言語に変換したい (例: 1 => 英語、2 => フランス語など)

私は mySQL の CONVERT 関数と CAST 関数について調べてきましたが、ほとんどの場合、さまざまなデータ型を整数に変換することに重点を置いているようです。また、データを保存する特定の方法 (1 つのフィールドに複数の数値) を扱うものも見つかりませんでした。

mySQLクエリで整数をテキストに変換するにはどうすればよいですか?

アップデート

これが私のmySQLクエリです:

SELECT u.id, ulp.userid, ulp.languages, ll.id, ll.language_detail
FROM users AS u
JOIN user_language_profile AS ulp ON (ulp.userid = u.id)
JOIN language_detail AS ll ON (ulp.languages = ll.id)
4

3 に答える 3

5

次のいずれかを使用します。

  • MySQL のELT()機能:

    SELECT
      ELT(Languages
         , 'English' -- 1
         , 'French'  -- 2
         -- etc.
      )
    FROM   table_name
    
  • CASE式:

    SELECT
      CASE Languages
        WHEN 1 THEN 'English'
        WHEN 2 THEN 'French'
        -- etc.
      END
    FROM table_name
    

ただし、可能であればJOIN、ルックアップ テーブル (@Mr.TAMER が言うように) を使用するか、列のデータ型をENUM('English','French',...).


アップデート

あなたのコメントから、各フィールドには一連SETの言語が含まれているように見えます (おそらくデータ型を使用していますか?)。数値を文字列に置き換えたいですか?

まず、Bill Karwin の「データベース列に区切られたリストを格納するのは本当に悪いことですか?」に対する優れた回答を読んでください。

この場合、データベースを少し正規化することをお勧めします。各レコードが既存のテーブル内のエンティティの PK を単一の言語に関連付ける新しい言語エンティティ テーブルを作成します。次に、SELECTクエリ (その新しいテーブルへの結合) とGROUP_CONCAT集計を使用して、目的の言語名のリストを取得できます。

そのような正規化がなければ、唯一のオプションは文字列ベースの検索と置換を行うことです (これは特に効率的ではありません)。例えば:

SELECT CONCAT_WS(',',
  IF(FIND_IN_SET('1', Languages), 'English', NULL),
  IF(FIND_IN_SET('2', Languages), 'French' , NULL),
  -- etc.
)
FROM table_name
于 2012-04-30T23:22:57.563 に答える
1

番号と言語の表を作成して、SELECT選択した番号に関連付けられている言語を取得してみませんか。

これは、新しい言語を追加する場合に適しています。コード内のすべてのクエリを変更する代わりに、テーブルに挿入するだけで済みます。また、他の人があなたのコードを使用している場合も簡単です (すべてのクエリのデバッグと編集に満足していないでしょう)。

于 2012-04-30T23:24:41.320 に答える
1

他のコメントから、言語フィールドはコンマが埋め込まれたリテラル文字列だと言っていますか?

SQL の観点からは、これはかなり機能しない設計です。可変数の言語を別のテーブルに格納する必要があります。

しかし、あなたが手に入れたもので行き詰っているなら、正規表現置換アルゴリズムを構築できるかもしれませんが、それはひどく壊れやすいようで、私はお勧めしません. 9 つ以上の言語を使用している場合、以下は壊れてしまい、複雑さをもたらすRegexp UDFが必要になります。

単純なケースを想定すると:

SELECT REPLACE(
            REPLACE(
                REPLACE(Languages, '1', 'English'),
                '2', 'French'),
            N, DESCRIPTION)

等々。しかし繰り返しますが、これはひどいデータ設計です。次のようなものに修正できる場合:

person            person_lang          language
==========        ============         =========
person_id -----<  person_id
...               lang_id      >-----  lang_id
                                       lang_desc

そうすることを強くお勧めします。

于 2012-04-30T23:54:27.127 に答える