我有一个我想在查询中使用的ISO2国家/地区代码列表 像这样:
select cou, 128,13, 1
from ('AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', [snip]) as cou
但是......工作。
我记得过去做过这样的事情,但我找不到任何关于它的文件了。 这是一次性查询,所以我不介意性能,编码实践或可维护性。
有什么想法吗?
更新
正如Pax所指出的,出于各种好的理由,将这些数据放在我的数据库中确实是更好的做法。我理解他的意见,因为我会回答同样的问题。但是,此数据已经在另一个表中,在另一个数据库中,在另一个服务器上,在另一个网络上。
为了测试我的查询,我需要在这个新数据库的表中提供一些快速镜头值。我不想配置网络,跨服务器查询等只是为了测试我对一些真实数据的查询。我希望这能解释为什么我会反对这一次拍摄。
答案 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)