web-dev-qa-db-ja.com

テーブルの列データで最長の文字列を見つける方法

私はテーブルのような列が含まれています

  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

私は[〜#〜] cr [〜#〜]列からデータを取得したい、つまり現在のテーブルでは;#WR_1;#WR_2;# WR_3;#WR_4;#。私は使っています

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

しかし、それは戻ります

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

しかし、私が必要なのは長さ(26)ではなく、私はこのようにしたかった

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

最も簡単な方法は次のとおりです。

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

同じ最長の長さが複数ある場合、これは1つの値のみを返すことに注意してください。

71
Gordon Linoff

あなたはできる:

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

これを投稿してから1年以上前に賛成票を受け取ったので、情報を追加したいと思います。

  • このクエリは、最大長のすべての値を提供します。 TOP 1クエリを使用すると、これらの1つだけが取得されますが、これは通常は望ましくありません。
  • このクエリはおそらくテーブルを2回読み取る必要があります。最大長を取得するためのフルテーブルスキャンと、その長さのすべての値を取得するためのフルテーブルスキャンです。ただし、これらの操作は非常に単純な操作であるため、かなり高速です。 TOP 1クエリでは、DBMSはテーブルからすべてのレコードを読み取り、それらをソートします。そのため、テーブルは1回だけ読み取られますが、テーブル全体のソート操作はかなりの作業であり、大きなテーブルでは非常に遅くなる可能性があります。
  • 通常、クエリにDISTINCTを追加します(SELECT DISTINCT CR FROM ...)、すべての値を一度だけ取得するようにします。 wouldはソート操作ですが、すでに見つかったいくつかのレコードに対してのみです。繰り返しますが、大したことはありません。
  • 文字列の長さを非常に頻繁に処理する必要がある場合、そのための計算列(計算フィールド)の作成を考えるかもしれません。これはMS Access 2010で利用可能です。しかし、これを読むと、MS Accessで計算フィールドにインデックスを付けることができません。これが当てはまる限り、それらの利点はほとんどありません。文字列にLENを適用することは、通常、そのようなクエリを遅くするものではありません。
14

次のように取得できます。

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

確かに、もっとエレガントな方法があります

8
xeraphim

Oracle 11gの場合:

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

これは、「postgresの最長文字列」のGoogle検索での最初の結果であったため、postgresソリューションを探している人のために、ここに答えを掲載します。

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

postgresドキュメント: http://www.postgresql.org/docs/9.2/static/functions-string.html

2
tmthyjames

SELECT max(len(CR))AS Max_Length_String FROM table1の代わりに

つかいます

Table1からの選択(CR)

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

1

2つのクエリでこれを実現できます。これは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
Shobi

Postgresの場合:

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

これにより、@ Thorsten Kettnerの回答からpostgres用に変更された文字列自体が得られます

1
Srinivas Ra

質問に答えて、Prefixも取得するには、MySQLで次のことができます。

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

そしてそれは戻ります


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