2009-08-12 19 views
6

Tengo una lista de códigos de país ISO2 que quiero usar en una consulta.
Algo como esto:Usar la lista de valores codificados en la consulta

select cou, 128,13, 1 
from ('AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', [snip]) as cou 

Pero .. trabajo.

Recuerdo haber hecho algo así en el pasado, pero ya no puedo encontrar ningún documento al respecto. Es una consulta única, así que no me importa el rendimiento, la práctica de codificación o la capacidad de mantenimiento.

¿Alguna idea?

ACTUALIZACIÓN
Como se señaló Pax, de hecho es mejor la práctica de tener estos datos en mi base de datos para todas las buenas razones. Entiendo su opinión porque respondería lo mismo. Sin embargo, estos datos ya están en otra tabla, en otra base de datos, en otro servidor, en otra red ...

Para probar mis consultas necesito algunos valores de captura rápida en una tabla en esta nueva base de datos. No quiero configurar redes, consultas entre servidores, etc. solo para probar mis consultas sobre algunos datos de la vida real. Espero que esto explique por qué voy en contra de la corriente para esta oportunidad.

+2

Me gusta cómo, a pesar de mi descargo de responsabilidad, la gente todavía sugiere que debería ponerlo en una mesa. No me malinterpretes Yo haría lo mismo :) –

Respuesta

2

Primera forma mediante la unión:

select 'AD' union all select 'AE' .... 

El segundo - no es obvio, pero elegante - el uso de consultas recursivas;

declare @x as varchar(200) 
set @x = 'ADAEAFAGAIALAM' 
;with FakeTbl AS (
    SELECT substring(@x, 1, 2) sval, 0 as ROWN 
     WHERE LEN(@x) > 0 
    UNION ALL 
    SELECT substring(@x, (it.ROWN+1)*2+1, 2) sval, it.ROWN+1 as ROWN 
     FROM FakeTbl it 
     WHERE LEN(@x) > (it.ROWN+1)*2 
) 
select sval, ROWN from FakeTbl 

le coloca a @x cadena, en el supuesto de que el código ha len 2. Pequeño restricción de este método es el nivel recursivo (para 2005 es de 100)

+0

Puede eliminar el límite de recursión predeterminado agregando OPCIÓN (MAXRECURSIÓN 0) al final de su consulta –

+4

Parece que tenemos diferentes definiciones de la palabra "elegante" :-) – paxdiablo

+0

@Pax: esta muestra está tomada del código real. Acabamos de crear la función de valor de tabla, que acepta una cadena varchar (por lo que en lugar de @x argumento de entrada utilizado). Y funciona en casos de uso múltiple. – Dewfy

4

El mejor manera de hacer esto (a pesar de su deseo de tenerlos no modificable) es crear una tabla de códigos de país:

create table iso2_codes (
    code char(2) primary key 
) 
insert into iso2_codes (code) vales ('AD'); 
insert into iso2_codes (code) vales ('AE'); 
: : : 
insert into iso2_codes (code) vales ('AM'); 

Entonces sólo tiene que utilizar

select code, 128, 13, 1 from iso2_codes; 

I Estoy firmemente convencido de que los datos se deben almacenar en tablas donde se puedan cambiar fácilmente, no incrustados en el código fuente o en los scripts, donde es una pesadilla rastrear y modificar.

Esa es mi opinión, otros pueden estar en desacuerdo.

+0

+1. A pesar de que las otras respuestas le dan una solución a lo que pregunta, debe detenerse y pensar en lo que le costará mantenerlo. –

+0

El problema es que los datos están en otra base de datos y deben colocarse en esta tabla en otro servidor. Sería mucho más trabajo configurar MUCh para configurar la red, las conexiones, los derechos y las consultas entre servidores, luego simplemente seleccionarlos e insertarlos a través de esta lista. –

+0

He añadido algo de información en el OP con respecto a esto –

3

respuesta de Pax es el enfoque correcto. Pero si insiste en hacerlo en línea:

select cou, 128,13, 1 
from (select 'AD' as cou 
     union all select 'AE' 
     union all select 'AF' 
     union all select 'AG' 
     union all select 'AI' 
     union all select 'AL' 
     union all select 'AM') as X 
12

La palabra clave de los valores se puede utilizar para lograr esto.

select col1, 128 col2, 13 col3, 1 col4 
from (values ('AD'), ('AE'), ('AF'), ('AG'), ('AI'), ('AL'), ('AM')) as x (col1) 
+0

Esto debe marcarse como la respuesta correcta, independientemente de su comprensión de la elegancia. Para unirse, 'SELECCIONAR * FROM RealTable INNER JOIN (VALUES (' un valor '), (' another_val ')) AS x (col) ON RealCol = col'. Para unir creando un cartesiano, 'SELECCIONAR * FROM RealTable INNER JOIN (VALUES (' un valor '), (' another_val ')) AS x (col) ON 1 = 1' – Chris

Cuestiones relacionadas