2016-10-04 17 views
1

カラムの一部のみを選択する方法はありますか?私は部分文字列を使うことができますが、私は列の文字列部分を選択する必要があります。例として:列には、次を含めることができます。MySQLカラムの一部のみを選択してください

DIRL100

私は別として、1列のみでDIRL一部、および100一部を選択する必要があります。

I そうのように、この特定の列でそれを行うことができます:

SELECT SUBSTRING(column, 5) AS part1, SUBSTRING(column, 1, 4) AS part2 ....

しかし、私はその常に4文字(DIRL)、それが数値を取得する前には..私は何とかREGEXPを使用できることを確認することはできませんまたは各列の数字部分と文字部分だけを抽出する何か?

言い換えれば..文字をどこで終えるかで列を分割できますか?例として、DIRL100またはAB100200が含まれていて、列(DIRLまたはAB)の文字と列の数字(100または100200)を含む2つの列に分割する必要がありますか?

+0

完全にあなたの問題を理解していない、あなたはいくつかの例と期待される出力をお願いしますか? –

+0

(しかし、私はいつも4文字(DIRL)が数値になることを確信できません)あなたの分割条件は何ですか? – Karthi

+0

スプリット条件は、プレフィックスが文字で終わるときです。更新の質問 –

答えて

1

はこの要求を試してみてください:

SELECT LEFT(column, patindex('%[0-9]%', column)-1) AS Part1 
    , RIGHT(column, LEN(column) - patindex('%[0-9]%', column)+1) AS Part2 
+0

これはあなたの2つの例で動作します... – Francois

+0

これはSQLサーバーですが、質問はmysqlについてです。 patindexはmysqlのために作成することができますが、http://stackoverflow.com/questions/38315658/patindex-replacement-in-mysql – Kris

+0

を参照してください。 :) – Francois

0

は残念ながら、MySQLでの正規表現の機能が制限されています。あなたはあなたを助けるためのカスタム関数を書く必要があります。

DROP FUNCTION IF EXISTS get_index; 

DELIMITER $$ 
CREATE FUNCTION get_index(targetString VARCHAR(255)) RETURNS INTEGER 
BEGIN 

    DECLARE i INTEGER; 
    DECLARE min_index INTEGER; 
    DECLARE current_index INTEGER; 
    SET i = 0; 
    SET min_index = NULL; 

    loopNumbers: WHILE (i <= 9) DO 
     SET current_index = LOCATE(i, targetString); 
     IF current_index > 0 THEN 
      IF min_index IS NULL OR current_index < min_index THEN 
       SET min_index = current_index; 
      END IF; 
     END IF; 

     SET i = i + 1; 

    END WHILE; 

    RETURN(min_index); 

END 
$$ 
DELIMITER ; 

この機能の機能は、数字の最初の位置を取得することです。

SELECT SUBSTRING(column_name FROM 1 FOR get_index(column_name)-1) AS first, SUBSTRING(column_name FROM get_index(column_name)) AS second 
FROM table_name 
WHERE column_name REGEXP '^[a-Z]+[0-9]+$' 

追加のWHERE条件は、正しい形式のデータのみが選択されるようにするためにオプションです。

関連する問題