在MySQL中选择字符串的一部分。

5

我有一个包含 string 的列,格式如下:

India_Project1_BA_Protex_123

Japan_ProQ_CXR_Tbxc_3456

我需要像这样在mySQL中选择Project1_BAProQ_CXR

4个回答

16

有两个函数可以提取字符串的一部分,它们是SUBSTRINGSPLITSTRING,但SUBSTRING无法在这种情况下使用,而SPLITSTRINGMySql中不存在。因此,您需要编写自己的函数:

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/

希望这可以帮助到你。


谢谢,问题解决了。我使用了这个查询:Select 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 如果这些答案有帮助,请接受它们...谢谢。 - talha2k
我稍微修改了SPLIT_STR函数,因为在我的情况下使用多字节字符时它会出现问题,请参见https://dev59.com/92PVa4cB1Zd3GeqP6ohe#40580413。 - joshweir

3

这对您有效吗?

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

我已经尝试了这样的操作:Select SUBSTRING_INDEX('India_Project1_BA_Protex_123', "_", 2)。但是它给出的前两个部分是'India_Project1',而我想要第二个和第三个部分是'Project1_BA'。 - Gulrej

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

你有检查过吗?它能正常工作吗?它给我返回了错误:#1582 - 调用本地函数'instr'时参数计数不正确。 - talha2k
抱歉,我没看到它是针对MySQL的...我在Oracle上测试了以上代码,它们可以正常工作。 - knurdy
你应该更新你的答案并且提到它适用于Oracle。 - talha2k

0

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接