2015-04-17 35 views
0

我在文本字段中有一些数据用换行符分隔。对于每一行,我想得到该行中最长行的长度。MySQL查询来计算文本字段中的最长行

如果例如一行含有以下数据

the cat\nsat on the\nmat 

然后我想要一个查询以返回图10中,最长行的长度“坐在”。

+0

我不认为这可以通过单纯的SQL来完成。你应该使用编程。 – ankur140290

+0

我同意@ Ankur140290,尤其是因为在mysql中没有split()函数 – PierrOz

+0

您可以为此创建一个用户函数,例如,请参阅http://stackoverflow.com/questions/17942508/sql-split-values-to-multiple -rows – AlecTMH

回答

2

那么这里是一个想法...

为了方便阅读,在这种解决方案我已经取代“\ n”与“|”。

请记住,仅仅因为你'可以',它并不遵循你'应该'!

SET @string = "the cat|sat on the|mat"; 

SELECT * FROM ints; 
+---+ 
| i | 
+---+ 
| 0 | 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
+---+ 

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@string,"|",i),"|",-1)x FROM ints; 
+------------+ 
| x   | 
+------------+ 
|   | 
| the cat | 
| sat on the | 
| mat  | 
| mat  | 
| mat  | 
| mat  | 
| mat  | 
| mat  | 
| mat  | 
+------------+ 

SELECT LENGTH(SUBSTRING_INDEX(SUBSTRING_INDEX(@string,"|",i),"|",-1))x FROM ints ORDER BY x DESC LIMIT 1; 
+------+ 
| x | 
+------+ 
| 10 | 
+------+ 
+0

您的答案或Mani Deep的答案都不允许每行有任意数量的换行符,但您的答案更接近标记。你已经足够让我做我想做的事情,但是我认为你是评论'只是因为你可以,并不意味着你应该'在这种情况下是正确的。 – Dom

+0

那么你可以尽可能经常地跨入int表,但是是的,这个观点依然存在。 – Strawberry

1

检查此sqlfiddle

CREATE TABLE tablename (
    id INT, 
    name VARCHAR(50)); 

INSERT INTO tablename VALUES 
    (1, 'the cat\nsat on the\nmat'), 
    (2, 'd'); 

查询:

SELECT 
max(length(SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.name, '\n', numbers.n), '\n', -1))) name 
FROM 
(SELECT 1 n UNION ALL SELECT 2 
UNION ALL SELECT 3 UNION ALL SELECT 4) numbers INNER JOIN tablename 
    ON CHAR_LENGTH(tablename.name) 
-CHAR_LENGTH(REPLACE(tablename.name, '\n', ''))>=numbers.n-1 
ORDER BY 
id, n 

结果:

name 
10 

参考:here