5

我有一个string这样的专栏

India_Project1_BA_Protex_123

Japan_ProQ_CXR_Tbxc_3456

我需要选择Project1_BAProQ_CXR喜欢这个mySQL

4

4 回答 4

16

有两个函数用于提取字符串的某些部分,它们是SUBSTRING&SPLITSTRINGSUBSTRING在这种情况下不能使用,并且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   |
+------------++-------+

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

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

希望这可以帮助。

于 2012-05-07T05:07:21.053 回答
3

这对你有用吗?

SELECT * FROM table WHERE colum LIKE '%Project1_BA%' OR column LIKE '%ProQ_CXR%'
于 2012-05-07T04:48:30.270 回答
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
于 2012-05-07T05:21:32.853 回答
0

添加到AlphaMale 的答案我是否建议更改代码编辑,不确定这里的礼仪?),我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      |
+------------+
于 2016-11-14T00:39:25.790 回答