web-dev-qa-db-fra.com

Comment trouver la chaîne la plus longue dans les données de colonne de la table

J'ai une table contenant les colonnes comme

  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

Je veux récupérer des données de CR colonne O WH il a la plus longue chaîne de texte, c'est-à-dire qu'il est dans la table actuelle ; # WR_1; # WR_2; # WR_3; # WR_4; #. j'utilise

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

Mais ça retombe

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

Mais ce dont j'ai besoin n'est pas la longueur (26), je voulais comme ça

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

Le moyen le plus simple est:

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

Notez que cela ne renverra qu'une valeur s'il y en a plusieurs avec la même plus grande longueur.

71
Gordon Linoff

Vous pouvez:

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

Venant juste de recevoir un vote positif plus d’un an après avoir posté ceci, je voudrais ajouter quelques informations.

  • Cette requête donne toutes les valeurs avec la longueur maximale. Avec une requête TOP 1, vous n’en obtenez qu’une, ce qui n’est généralement pas souhaitable.
  • Cette requête doit probablement lire la table deux fois: une analyse complète de la table pour obtenir la longueur maximale et une autre analyse complète de la table pour obtenir toutes les valeurs de cette longueur. Cependant, ces opérations sont très simples et donc assez rapides. Avec une requête TOP 1, un SGBD lit tous les enregistrements de la table, puis les trie. Ainsi, la table est lue une seule fois, mais une opération de tri sur une table entière est une tâche ardue et peut être très lente sur des tables volumineuses.
  • On ajouterait généralement DISTINCT à ma requête (SELECT DISTINCT CR FROM ...), afin d’obtenir chaque valeur une seule fois. Ce serait serait une opération de tri, mais seulement sur les quelques enregistrements déjà trouvés. Encore une fois, pas de problème.
  • Si les longueurs de chaîne doivent être traitées assez souvent, on pourrait penser à créer une colonne calculée (champ calculé) pour celle-ci. Ceci est disponible à partir de MS Access 2010. Toutefois, une lecture à ce sujet montre que vous ne pouvez pas indexer les champs calculés dans MS Access. Tant que cela reste vrai, il n'y a pratiquement aucun avantage à en tirer profit. Appliquer LEN sur les chaînes n'est généralement pas ce qui ralentit ces requêtes.
14
Thorsten Kettner

Vous pouvez l'obtenir comme ceci:

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

mais je suis sûr qu'il existe un moyen plus élégant de le faire

8
xeraphim

Pour Oracle 11g:

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

C'était le premier résultat de la recherche Google sur "la plus longue chaîne dans postgres", je vais donc mettre ma réponse ici pour ceux qui recherchent une solution postgres.

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

postgres docs: http://www.postgresql.org/docs/9.2/static/functions-string.html

2
tmthyjames

Au lieu de SELECT max (len (CR)), AS Max_Length_String FROM table1

Utilisation

SELECT (CR) FROM table1

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

1
tHiNk_OuT_oF_bOx

Avec deux requêtes, vous pouvez y parvenir. Ceci est pour 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

Pour Postgres:

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

Cela vous donnera la chaîne elle-même, modifiée pour postgres de @Thorsten Kettner answer

1
Srinivas Ra

Pour répondre à votre question et obtenir le Prefix également, MySQL vous permet d'effectuer les tâches suivantes:

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

et il reviendra


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