在查询中使用硬编码的值列表

时间:2009-08-12 06:58:09

标签: sql-server-2005

我有一个我想在查询中使用的ISO2国家/地区代码列表 像这样:

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

但是......工作。

我记得过去做过这样的事情,但我找不到任何关于它的文件了。 这是一次性查询,所以我不介意性能,编码实践或可维护性。

有什么想法吗?

更新
正如Pax所指出的,出于各种好的理由,将这些数据放在我的数据库中确实是更好的做法。我理解他的意见,因为我会回答同样的问题。但是,此数据已经在另一个表中,在另一个数据库中,在另一个服务器上,在另一个网络上。

为了测试我的查询,我需要在这个新数据库的表中提供一些快速镜头值。我不想配置网络,跨服务器查询等只是为了测试我对一些真实数据的查询。我希望这能解释为什么我会反对这一次拍摄。

4 个答案:

答案 0 :(得分:16)

可以使用Values关键字来实现此目的。

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

答案 1 :(得分:4)

最佳方式(尽管您希望对其进行硬编码)是创建国家/地区代码表:

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');

然后使用

select code, 128, 13, 1 from iso2_codes;

我坚信数据应该存储在可以轻松更改的表格中,而不是嵌入在源代码或脚本中,这些都是追踪和修改的噩梦。

我认为,其他人可能不同意。

答案 2 :(得分:3)

Pax的答案是正确的方法。但如果你坚持要在线进行:

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

答案 3 :(得分:2)

使用union的第一种方式:

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

第二种 - 不明显但优雅 - 使用递归查询;

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

你放置@x字符串,假设代码有len 2.这个方法的小限制是递归级别(对于2005年它是100)