循环访问 SELECT 案例查询行,将"comma"附加到除最后一行之外的每一行



我有多个绝对文件路径,它们存储在列"中;name";它是字符串数据类型的,我有一个开关情况SELECT查询,它调整输出,使:

  • 文件路径由_2值替换(新目标(
  • ";name";列包含大写和小写
  • 我在通过_2指定的新目标中返回结果,但将文件名部分转换为大写
  • 最后,对于每一行,我连接一个"(逗号(在每行输出的末尾

图例:

a1=C:Dir1RESULTfilelistfilename.file
a2=E:SomeOtherDir1RESULTxyzfilelistFILENAME.FILE
b1=C:Dir2RESULTfilelistfilename.file
b2=E:SomeOtherDir2RESULT123filelistFILENAME.FILE
... etc

我知道所有的a2、b2和c2路径是什么。

下面的块按预期工作,我基本上只使用REPLACE((和UPPER((的组合来有效地大写文件名部分。

SELECT
CASE
WHEN name LIKE 'C:Dir1RESULTfilelist%' -- this is a1%
THEN REPLACE (UPPER(name), 'C:Dir1RESULTfilelist', -- this is a1
'E:SomeOtherDir1RESULTxyzfilelist') || ''',' -- this is a2, returned with UPPERCASE filename and concat a comma
WHEN name LIKE 'C:Dir2RESULTfilelist%' -- this is b1%
THEN REPLACE (UPPER(name), 'C:Dir1RESULTfilelist', -- this is b1
'E:SomeOtherDir2RESULT123filelist') || ''',' -- this is b2, returned with UPPERCASE filename and concat a comma
WHEN name LIKE 'c1%'
THEN REPLACE (UPPER(name), 'c1',
'c2') || ''','
-- etc
END AS "NEW_PATH"
FROM table ORDER BY 1;

现在我该如何使上面的代码为除最后一行之外的每一行添加逗号?

即,如果我有50行,只在前49行加一个逗号。。。。。回顾性地,如果我有1025行,只为前1024行添加一个逗号

我希望这是清楚的。

非常感谢!

您可以在不向任何字符串添加逗号的情况下替换字符串,然后使用分析函数和大小写表达式在除最后一个之外的所有字符串后面添加逗号,使用类似于的方法

CASE WHEN ROW_NUMBER() OVER (ORDER BY new_path DESC) > 1 THEN ',' END

CCD_ 1基于指定的顺序来分配序列号;通过使用DESC,第一行被指定为50或1024或其他什么,您并不真正关心,但最后一行总是被指定为1。这使您可以将逻辑应用于除编号为1的行之外的所有行,这是最后一行,因此不会得到逗号,但所有其他行都得到逗号

如果您可以使用订单的原始名称(即替换不会改变订单(,您可以将其作为一个查询级别的一部分:

SELECT
CASE
WHEN name LIKE 'C:Dir1RESULTfilelist%'
THEN REPLACE (UPPER(name),
'C:DIR1RESULTFILELIST',
'E:SomeOtherDir1RESULTxyzfilelist')
WHEN name LIKE 'C:Dir2RESULTfilelist%'
THEN REPLACE (UPPER(name), 
'C:DIR2RESULTFILELIST',
'E:SomeOtherDir2RESULT123FILELIST')
-- etc
END
|| CASE WHEN ROW_NUMBER() OVER (ORDER BY name DESC) > 1 THEN ',' END
AS new_path
FROM your_table ORDER BY 1;

或者如果最终订单与原始订单不匹配,则使用子查询:

SELECT new_path
|| CASE WHEN ROW_NUMBER() OVER (ORDER BY new_path DESC) > 1 THEN ',' END
AS new_path
FROM (
SELECT
CASE
WHEN name LIKE 'C:Dir1RESULTfilelist%'
THEN REPLACE (UPPER(name),
'C:DIR1RESULTFILELIST',
'E:SomeOtherDir1RESULTxyzfilelist')
WHEN name LIKE 'C:Dir2RESULTfilelist%'
THEN REPLACE (UPPER(name), 
'C:DIR2RESULTFILELIST',
'E:SomeOtherDir2RESULT123FILELIST')
-- etc
END AS new_path
FROM your_table ORDER BY 1
)
ORDER BY new_path;

db<gt;小提琴

最新更新