Câu hỏi Cách tìm chuỗi dài nhất trong dữ liệu cột của bảng


Tôi có một bảng chứa các cột như

  Prefix    |  CR
----------------------------------------
  g         |  ;#WR_1;#WR_2;#WR_3;#WR_4;# 
  v         |  ;#WR_3;#WR_4;#
  j         |  WR_2
  m         |  WR_1
  d         |  ;#WR_3;#WR_4;#   
  f9        |  WR_3

Tôi muốn lấy dữ liệu từ CR cột Ở đâu nó có chuỗi văn bản dài nhất tức là trong bảng hiện tại, nó là ; # WR_1; # WR_2; # WR_3; # WR_4; #. Tôi đang sử dụng

SELECT max(len(CR)) AS Max_Length_String FROM table1 

Nhưng nó retuns

Max_Length_String
----------------------------------------
26

Nhưng những gì tôi cần không phải là chiều dài (26), tôi muốn như thế này

Max_Length_String
----------------------------------------
;#WR_1;#WR_2;#WR_3;#WR_4;# 

29
2018-02-19 15:38


gốc




Các câu trả lời:


Cách dễ nhất là:

select top 1 CR
from table t
order by len(CR) desc

Lưu ý rằng điều này sẽ chỉ trả lại một giá trị nếu có nhiều giá trị có cùng độ dài dài nhất.


52
2018-02-19 15:46



Hoàn hảo!!!! nó hoạt động. Cảm ơn bạn đã trả lời nhanh chóng. Làm cách nào để phân tích chuỗi này ; # WR_1; # WR_2; # WR_3; # WR_4; # như thế này 'WR_1, WR_2, WR_3, WR_4 Là một dữ liệu cột. - vuyy1182
Với Access, SELECT TOP trả về các mối quan hệ. - HansUp
"Truy cập không có các chức năng tuyệt vời để thực hiện điều đó" - Không giống như chức năng "Replace ()" thay thế cho bạn? - Johnny Bones
@JohnnyBones. . . Tôi đã tập trung vào phần "phân tích" của tuyên bố. Tôi nghĩ có một câu hỏi khác về điều này mà bạn có thể trả lời. - Gordon Linoff
Oh. Sau đó, nó không giống như một "Split ()" chức năng thẳng cho bạn? : oP - Johnny Bones


Bạn có thể:

SELECT CR 
FROM table1 
WHERE len(CR) = (SELECT max(len(CR)) FROM table1)

Vừa nhận được một upvote hơn một năm sau khi đăng bài này, tôi muốn thêm một số thông tin.

  • Truy vấn này cung cấp tất cả các giá trị có độ dài tối đa. Với truy vấn TOP 1, bạn chỉ nhận được một trong các truy vấn này, thường không được mong muốn.
  • Truy vấn này có lẽ phải đọc bảng hai lần: quét toàn bộ bảng để có độ dài tối đa và một lần quét bảng đầy đủ khác để có được tất cả các giá trị của độ dài đó. Những hoạt động này, tuy nhiên, là những hoạt động rất đơn giản và do đó khá nhanh. Với truy vấn TOP 1, DBMS đọc tất cả các bản ghi từ bảng và sau đó sắp xếp chúng. Vì vậy, bảng được đọc chỉ một lần, nhưng một hoạt động sắp xếp trên một bảng toàn bộ là khá một số nhiệm vụ và có thể rất chậm trên các bảng lớn.
  • Người ta thường thêm DISTINCT truy vấn của tôi (SELECT DISTINCT CR FROM ...), để có được mọi giá trị chỉ một lần. Cái đó sẽ là một hoạt động sắp xếp, nhưng chỉ trên vài bản ghi đã được tìm thấy. Một lần nữa, không có vấn đề lớn.
  • Nếu độ dài chuỗi phải được xử lý khá thường xuyên, người ta có thể nghĩ đến việc tạo cột được tính toán (trường được tính toán) cho nó. Điều này có sẵn như của Ms Access 2010. Nhưng đọc lên trên này cho thấy rằng bạn không thể lập chỉ mục các trường được tính toán trong MS Access. Miễn là điều này đúng, hầu như không có lợi ích gì từ chúng. Áp dụng LEN trên dây thường không phải là những gì làm cho các truy vấn như vậy chậm.

13
2018-02-19 15:45



Nói chung là tốt, nhưng nếu bạn nghĩ về nó, một lệnh TOP N không đòi hỏi một loại toàn bộ bảng, chỉ cần một bộ đệm có kích thước N. Trong lần quét bảng ban đầu nó có thể thực hiện chèn nhị phân vào bộ đệm chỉ những đồ vật lớn hơn Nth mà nó được nhìn thấy cho đến nay. - Tristan Reid


Bạn có thể nhận được nó như thế này:

SELECT TOP 1 CR
FROM tbl
ORDER BY len(CR) DESC

nhưng tôi chắc chắn, có một cách thanh lịch hơn để làm điều đó


7
2018-02-19 15:47





Đây là kết quả đầu tiên trên "chuỗi dài nhất trong postgres" tìm kiếm google vì vậy tôi sẽ đặt câu trả lời của tôi ở đây cho những người tìm kiếm một giải pháp postgres.

SELECT max(char_length(column)) AS Max_Length_String FROM table

tài liệu postgres: http://www.postgresql.org/docs/9.2/static/functions-string.html


2
2018-01-25 19:37



OP muốn chuỗi dài nhất, không phải là chuỗi dài nhất. - Andrew Morton


Đối với Oracle 11g:

SELECT COL1 
FROM TABLE1 
WHERE length(COL1) = (SELECT max(length(COL1)) FROM TABLE1);

2
2017-08-29 23:22





Đối với Postgres:

SELECT column
FROM table
WHERE char_length(column) = (SELECT max(char_length(column)) FROM table )

Điều này sẽ cung cấp cho bạn chuỗi chính nó, được sửa đổi cho postgres từ câu trả lời @Thorsten Kettner


1
2017-10-27 10:07





Với hai truy vấn bạn có thể đạt được điều này. Điều này là dành cho mysql

//will select shortest length coulmn and display its length.
// only 1 row will be selected, because we limit it by 1

SELECT column, length(column) FROM table order by length(column) asc limit 1;

//will select shortest length coulmn and display its length.

SELECT CITY, length(city) FROM STATION order by length(city) desc limit 1;

1
2018-03-23 05:46





Thay vì SELECT max (len (CR)) AS Max_Length_String FROM table1

Sử dụng

CHỌN (CR) TỪ bảng1

WHERE len (CR) = (SELECT tối đa (len (CR)) TỪ bảng1)


1
2018-02-19 15:48





Để trả lời câu hỏi của bạn và nhận Prefix quá, đối với MySQL bạn có thể làm:

select Prefix, CR, length(CR) from table1 order by length(CR) DESC limit 1;

và nó sẽ trở lại


+-------+----------------------------+--------------------+
| Prefix| CR                         |         length(CR) |
+-------+----------------------------+--------------------+
| g     | ;#WR_1;#WR_2;#WR_3;#WR_4;# |                 26 |
+-------+----------------------------+--------------------+
1 row in set (0.01 sec)

0
2018-04-27 11:04