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

Bor*_*ens 8 sql-server-2005

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

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

但..工作.

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

有任何想法吗?

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

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

小智 17

值关键字可用于实现此目的.

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

  • 无论您对优雅的理解如何,这都应该标记为正确答案。要加入,`SELECT * FROM RealTable INNER JOIN ( VALUES ('one value'), ('another_val')) AS x (col) ON RealCol=col`。要加入创建笛卡尔,`SELECT * FROM RealTable INNER JOIN ( VALUES ('one value'), ('another_val')) AS x (col) ON 1=1` (3认同)

Ed *_*per 6

帕克斯的回答是正确的做法。但如果你坚持在线执行:

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
Run Code Online (Sandbox Code Playgroud)


Dew*_*wfy 5

第一种使用联合的方式:

select 'AD' union all select 'AE' ....
Run Code Online (Sandbox Code Playgroud)

第二个——不明显,但优雅——使用递归查询;

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
Run Code Online (Sandbox Code Playgroud)

您放置到@x 字符串,假设代码具有 len 2。此方法的小限制是递归级别(2005 年为 100)

  • 我们似乎对“优雅”这个词有不同的定义:-) (4认同)