2012-05-07 2 views

ответ

3

ли эта работа для вас?

SELECT * FROM table WHERE colum LIKE '%Project1_BA%' OR column LIKE '%ProQ_CXR%' 
+0

Это не будет работать для меня, потому что строки являются динамическими, – Gulrej

+0

Я попытался, как этот Select SUBSTRING_INDEX («India_Project1_BA_Protex_123», «_», 2), но это дает мне две первые части, как «India_Project1 ', но я хочу, чтобы вторая и третья части были «Project1_BA» – Gulrej

14

Есть две функций для извлечения некоторой части строки, они SUBSTRING & SPLITSTRING но SUBSTRING не могут быть использованы в данном случае и SPLITSTRING нет в MySql. Таким образом, вы должны написать свою собственную функцию:

MySQL не включает функцию разделения строки. Тем не менее, очень легко создать свою собственную функцию.

Create function syntax

A user-defined function is a way to extend MySQL with a new function that works like a native MySQL function.

CREATE [AGGREGATE] FUNCTION function_name 
RETURNS {STRING|INTEGER|REAL|DECIMAL} 

To create a function, you must have the INSERT privilege for the database.

Split strings

The following example function takes 3 parameters, performs an operation using an SQL function, and returns the result.

Function

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, ''); 

Usage

SELECT SPLIT_STR(string, delimiter, position) 

Example

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 | 
+------------++-------+ 

Теперь вы можете сцепить два результата. чтобы получить окончательный результат.

Полный учебник здесь: http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/

Надеется, что это помогает.

+0

Спасибо, Получил решение. Я использовал этот запрос. Выберите CONCAT (REPLACE (SUBSTRING (SUBSTRING_INDEX ('India_Project1_BA_Protex_123', '_', 2), LENGTH (SUBSTRING_INDEX ('India_Project1_BA_Protex_123', '_', 2 -1)) + 1), '_' , ''), '_', REPLACE (SUBSTRING (SUBSTRING_INDEX ('India_Project1_BA_Protex_123', '_', 3), LENGTH (SUBSTRING_INDEX ('India_Project1_BA_Protex_123', '_', 3 -1)) + 1), ' _ ',' ')) – Gulrej

+2

@Gulrej Пожалуйста, примите ответы, если они помогли ... Спасибо. – AlphaMale

+0

Я немного изменил функцию 'SPLIT_STR', поскольку он разбился для моего случая с использованием многобайтовых символов, см. Http://stackoverflow.com/a/40580413/4852737 – joshweir

0

EDIT: Они работают для 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 
+0

Вы проверили его? Если он работает?? Это дало мне ошибку: # 1582 - Неправильный счетчик параметров в вызове функции native «instr» – AlphaMale

+0

жаль, что я не вижу, что это было для mysql ... Я тестировал выше для Oracle, и они работают .. – knurdy

+0

вам следует обновить ваш ответ и упоминание об этом работает для оракула. – AlphaMale

0

Добавление к AlphaMale's answer (ли я предлагаю код изменения редактировать, не уверен 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  | 
+------------+ 
Смежные вопросы