0

每个人。我有一个表,其中一个字段 (seq) 声明为 varchar(14),其中包含一串数字(由空格分隔的五个 2digits 数字)。对于每一行,我想将这些数字中的 4 个Union All的 5 种可能组合合并到一个列中。我的第一次尝试导致以下查询,它“应该”工作(尽管我承认它“有点”糟糕!):

SELECT id,ordered_seq FROM(
    SELECT id,
           seq,
           MIN(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)) AS A1,
           MAX(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)) AS E1,
           trim(replace(replace(replace(replace(seq,A1,''),'  ',' '),E1,''),'  ','')) AS T1,

           MIN(SUBSTR(T1,1,2),SUBSTR(T1,4,2),SUBSTR(T1,7,2)) AS B1,
           MAX(SUBSTR(T1,1,2),SUBSTR(T1,4,2),SUBSTR(T1,7,2)) AS D1,
           replace(replace(replace(T1,B1,''),D1,''),'  ','') AS C1,
           A1||' '||B1||' '||C1||' '||D1||' '||E1 AS ordered_seq
    FROM source_table
)
WHERE(seq<>'00 00 00 00 00')

这应该返回每行按升序排序的原始列,同时为工作的最后部分提供“索引”:如我之前所说,选择每行 4 个数字的所有可能组合。问题是,我第一次尝试在声明它的选择中使用别名时出现“没有这样的列”错误(即选择 col1 作为 c1,count(c1) 引发“没有这样的列:C1”错误)。这是正常行为吗?

我平时的运气。

更新的查询 -----------------

SELECT id, fir||' '||sec||' '||thi||' '||fou||' '||fif AS ordered_list 
FROM (
   SELECT id,
          Date,
          seq,
          MIN(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)) AS fir,
          MIN( SUBSTR(trim(replace(replace(replace(replace(seq,MIN(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' '),MAX(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' ')),1,2), SUBSTR(trim(replace(replace(replace(replace(seq,MIN(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' '),MAX(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' ')),4,2), SUBSTR(trim(replace(replace(replace(replace(seq,MIN(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' '),MAX(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' ')),7,2) ) AS sec,
          trim( replace(replace(trim(replace(replace(replace(replace(seq,MIN(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' '),MAX(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' ')),MIN( SUBSTR(trim(replace(replace(replace(replace(seq,MIN(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' '),MAX(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' ')),1,2), SUBSTR(trim(replace(replace(replace(replace(seq,MIN(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' '),MAX(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' ')),4,2), SUBSTR(trim(replace(replace(replace(replace(seq,MIN(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' '),MAX(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' ')),7,2) ),''),MAX( SUBSTR(trim(replace(replace(replace(replace(seq,MIN(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' '),MAX(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' ')),1,2), SUBSTR(trim(replace(replace(replace(replace(seq,MIN(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' '),MAX(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' ')),4,2), SUBSTR(trim(replace(replace(replace(replace(seq,MIN(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' '),MAX(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' ')),7,2) ),'')) AS thi,
          MAX( SUBSTR(trim(replace(replace(replace(replace(seq,MIN(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' '),MAX(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' ')),1,2), SUBSTR(trim(replace(replace(replace(replace(seq,MIN(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' '),MAX(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' ')),4,2), SUBSTR(trim(replace(replace(replace(replace(seq,MIN(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' '),MAX(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)),''),'  ',' ')),7,2) ) AS fou,
          MAX(SUBSTR(seq,1,2),SUBSTR(seq,4,2),SUBSTR(seq,7,2),SUBSTR(seq,10,2),SUBSTR(seq,13,2)) AS fif
   FROM source_table
)
WHERE (seq<>'00 00 00 00 00' AND Date BETWEEN '1939-01-07' AND '2012-12-24')
4

1 回答 1

1

列别名定义SELECT输出的名称。

要在 SELECT 子句本身中使用它们,您必须添加另一层间接:

SELECT c1 FROM (SELECT 42 AS c1)
于 2012-12-23T21:07:26.590 回答