2010-10-07 15 views
7

En una lista de países que deben mostrarse en orden alfabético, debe colocar a Estados Unidos en la parte superior de la lista. ¿Cómo vas a hacer esto?¿Cómo mantendrá un país específico en la parte superior en una lista desplegable?

Respondí diciendo que tendré una estructura de tabla de tal manera que EE. UU. Esté en id-0. El resto de los países se enumeran en su orden alfabético.

Así que cuando voy en busca de la mesa, voy a hacer un "SELECT CountryName from tableOfCountries ORDER by ID"

No estoy seguro de si el entrevistador quería escuchar esto. Así que sugerí otra opción de poblar una matriz de país con los EE. UU. Como primer elemento. Luego, el resto de los elementos se completará a partir del conjunto de resultados de la consulta.

"SELECT CountryName FROM tableOfCountries WHERE countryName != 'US' ORDER by COUNTRY_NAME". 

Esto asegurará que los Estados Unidos no se seleccionen dos veces.

El entrevistador tampoco estaba satisfecho con esta opción. Entonces él me preguntó si tenía alguna otra opción en mente. Luego dije un archivo de texto en el servidor web con la lista de valores.

¿Tiene alguna otra opción que se le ocurra?

+5

les digo que no sea tan Centrado en los Estados Unidos ;-) –

+0

No hay nada más molesto que una lista alfabética con algunas entradas desordenadas y puestas en la parte superior. Un usuario puede perder bastante tiempo buscando su país en el medio. Si desea una lista en la parte superior, haga una lista de ** duplicados ** y no una lista de entradas ** movidas **. – Quentin

+0

@David, esa respuesta probablemente habría molestado al entrevistador. – abhi

Respuesta

8

Generalmente algo como:

SELECT 
    CountryName 

from tableOfCountries 

ORDER by 
    (case when CountryName = 'US' then 0 
    else 1 end) asc, CountryName asc 
+0

No basaría la declaración de caso en CountryName. ¿Qué pasa si más tarde desea cambiar el nombre a 'Estados Unidos' en su lugar. ¿Puede estar seguro de recordar cambiarlo en la declaración del caso? – kevev22

+1

@ kevev22: Luego basarlo en la clave principal o asumir que el nombre no cambiará. Sí, es más frágil que modificar la tabla real para almacenar el valor, pero este enfoque no requiere ningún cambio en la estructura de la tabla (que puede o no ser un problema). –

+1

@ kevev22: Además, este enfoque también le brinda la flexibilidad de tener diferentes valores "predeterminados" en diferentes circunstancias (por ejemplo, se predetermina al país de origen del usuario en lugar de a los EE. UU.). Parece probable que esto suceda, como lo sería para el país o países predeterminados globales para cambiar. –

3

Tal vez:

select name from countries 
order by case when name = 'US' then 1 else 2 end, name; 
10

tener otro int columna en la tabla de país llamado precedencia.

Asignar Estados Unidos una precedencia mayor que 1 y dejar todos los demás países en 0.

Su SQL sería el siguiente aspecto:

select Name from countries 
order by precedence desc, name asc 

Esto le permitirá escalar esto más adelante si es necesario.

+0

¿Cuál sería el beneficio de agregar el campo ahora en lugar de si se necesita más adelante (lo que parece un poco improbable)? –

+2

@ Adam: ¿por qué crees que es poco probable? Si la base de clientes de OP se expande para que otros países también sean clientes importantes, entonces uno querría poner a esos países en la parte superior de la lista también. p.ej. A menudo veo drop-downs con varios países clasificados en la parte superior, p. Estados Unidos, Canadá, Reino Unido, Francia, Alemania, y luego solo después de eso, todos los demás países están ordenados alfabéticamente. – Ether

+0

@Ether: creo que es poco probable que sea una consideración en el corto plazo. Si no hay ningún beneficio al agregar la columna ahora en lugar de más tarde, entonces agregarlo antes de que sea necesario es una sobreingeniería (por leve que sea). –

3

Ciertamente no abusaría de la identificación de esa manera si pudiera evitarla.

Se podrían dar prioridades a los países y, a continuación:

select isoCode, name from countries order by priority desc, name 

Alternativamente, ¿por qué tenerlo en la parte superior? Sugeriría cambiar la lógica para que permanecieran en orden alfabético, pero EE. UU. Era la selección predeterminada hasta que se cambiara.

-1

Si esto está en C#, sin tener en cuenta cómo los datos vuelven del servidor, colocándolos en un tipo específico e implementando IComparable en el tipo dado. El desplegable los mantendrá en consecuencia, ya que puede especificar en el método CompareTo que el tipo de EE. UU. Es el "más grande" de los otros países.

class Country : IComparable<Country> 
{ 
    int IComparable<Country>.CompareTo(Country other) 
    { 
     <US logic> 
     else 
      return String.Compare(this.CountryName, other.CountryName); 
    } 
} 

EDIT: En realidad esto es en C# basado en etiquetas de la OP. Por qué el enfoque en la parte posterior para la presentación está teniendo lugar está más allá de mí.

+0

Err, no. No hay controles de datos que clasifiquen automáticamente los elementos en una fuente de datos en función de un resultado de comparación. –

+0

@ Adam No hay ninguna referencia en ningún lugar que indique que estos deben estar enlazados a datos. Siendo este el caso, colocar los objetos en un contenedor clasificable hará uso de la implementación IComparable y hará lo que desee al llamar a Sort(). Cualquier cosa que se haga con esa colección después del hecho no importa; uniéndolo a un ComboBox por ejemplo. Esto no es diferente, luego hacer esto en el back-end y empujar esa colección en sentido ascendente a la interfaz de usuario para que se muestre en un control dado. Si hablamos tecnologías .NET específicas, entonces también puede hacer uso de un CollectionView. –

1

Otra forma de hacerlo sería obtener su lista de estados y luego filtrarlos en una vista de datos, excluyendo los elementos predeterminados. A continuación, establezca la propiedad de control de lista AppendDataBoundItems en verdadero. Agregue sus elementos al control de lista y luego enlace de datos a la vista de datos.

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listcontrol.appenddatabounditems.aspx

Esto tendrá el efecto de no borrar sus valores por defecto cuando se produce la databind.

Cuestiones relacionadas