在mysql中选择一个字符串的一部分

时间:2012-05-07 04:44:04

标签: mysql

我在这一栏中有一个string

India_Project1_BA_Protex_123

Japan_ProQ_CXR_Tbxc_3456

我需要在Project1_BA

中选择ProQ_CXRmySQL这样的内容

4 个答案:

答案 0 :(得分:15)

提取字符串的某些部分有两个函数,它们是SUBSTRING& SPLITSTRINGSUBSTRING在这种情况下无法使用,SPLITSTRING中不存在MySql。所以你必须编写自己的函数:

MySQL不包含拆分字符串的功能。但是,创建自己的功能非常容易。

  

创建函数语法

     

user-defined function 是一种用新的方式扩展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   |
+------------++-------+

现在您可以连接两个结果。得到你的最终结果。

完整教程:http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/

希望这有帮助。

答案 1 :(得分:3)

这对你有用吗?

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

答案 2 :(得分:0)

编辑:他们为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

答案 3 :(得分:0)

添加到AlphaMale's answer我建议代码更改编辑,不确定这里的礼节吗?),我稍微改变了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      |
+------------+