私はstring
このような列を1つ持っています
India_Project1_BA_Protex_123
Japan_ProQ_CXR_Tbxc_3456
私はこれを選択Project1_BA
またはProQ_CXR
好きにする必要がありますmySQL
私はstring
このような列を1つ持っています
India_Project1_BA_Protex_123
Japan_ProQ_CXR_Tbxc_3456
私はこれを選択Project1_BA
またはProQ_CXR
好きにする必要がありますmySQL
文字列の一部を抽出する関数が 2 つあります。これらはSUBSTRING
&SPLITSTRING
ですがSUBSTRING
、この場合は使用できず、 にSPLITSTRING
はありませんMySql
。したがって、独自の関数を作成する必要があります。
MySQL には、文字列を分割する関数が含まれていません。ただし、独自の関数を作成するのは非常に簡単です。
関数構文を作成する
ユーザー定義関数は、ネイティブのMySQL 関数のように機能する新しい関数で MySQL を拡張する方法です。
CREATE [AGGREGATE] FUNCTION function_name RETURNS {STRING|INTEGER|REAL|DECIMAL}
関数を作成するには、データベースに対する INSERT 権限が必要です。
文字列を分割する
次の関数例は、3 つのパラメーターを取り、SQL 関数を使用して操作を実行し、結果を返します。
関数
CREATE FUNCTION SPLIT_STR( x VARCHAR(255), delim VARCHAR(12), pos INT ) RETURNS VARCHAR(255) RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos), LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1), delim, '');
使用法
SELECT SPLIT_STR(string, delimiter, position)
例
SELECT SPLIT_STR('India_Project1_BA_Protex_123', '_', 2) as second; SELECT SPLIT_STR('India_Project1_BA_Protex_123', '_', 3) as third; +------------++-------+ | second || third | +------------++-------+ | Project1 || BA | +------------++-------+ | ProQ || CXR | +------------++-------+
これで、2 つの結果を連結できます。最終結果を取得します。
完全なチュートリアルはこちら: http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/
お役に立てれば。
これはうまくいきますか?
SELECT * FROM table WHERE colum LIKE '%Project1_BA%' OR column LIKE '%ProQ_CXR%'
AlphaMale の回答(コード変更の編集を提案しますか? ここでは SO エチケットがわかりませんか? ) に追加してSPLIT_STR
、マルチバイト文字で壊れるため、udf をわずかに変更しました。
CREATE FUNCTION SPLIT_STR(
x VARCHAR(255),
delim VARCHAR(12),
pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
/* use CHAR_LENGTH instead of LENGTH */
CHAR_LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
delim, '');
例:
select split_str("Håkansson[!!]Maria", "[!!]", 2) as test;
+------------+
| test |
+------------+
| Maria |
+------------+
編集:彼らはORACLEで働きます
私は次のクエリを書きましたが、うまくいくようです...
SELECT
SUBSTR( (SELECT SUBSTR('India_Project1_BA_Protex_123',
INSTR('India_Project1_BA_Protex_123', '_')+1, instr('India_Project1_BA_Protex_123',
'_', 1,2)) AS output
FROM DUAL),1, INSTR((SELECT SUBSTR('India_Project1_BA_Protex_123',
INSTR('India_Project1_BA_Protex_123', '_')+1, instr('India_Project1_BA_Protex_123',
'_', 1,2)) AS output
FROM DUAL),'_',1,2)-1) FROM DUAL
SELECT
SUBSTR( (SELECT SUBSTR('Japan_ProQ_CXR_Tbxc_3456', INSTR('Japan_ProQ_CXR_Tbxc_3456',
'_')+1, instr('Japan_ProQ_CXR_Tbxc_3456', '_', 1,2)) AS output
FROM DUAL),1, INSTR((SELECT SUBSTR('Japan_ProQ_CXR_Tbxc_3456',
INSTR('Japan_ProQ_CXR_Tbxc_3456', '_')+1, instr('Japan_ProQ_CXR_Tbxc_3456', '_', 1,2))
AS output
FROM DUAL),'_',1,2)-1) FROM DUAL