Есть ли способ получить имя файла на основе расширения, но потенциально неизвестного значения? - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть база данных, в которой хранятся файлы, и в одной таблице их имена файлов и порядковый номер на номер записи, а также в другой таблице номер записи, которой назначены эти файлы. У меня есть приложение, обращенное к этой базе данных, и я хочу иметь возможность извлекать имена файлов из этой таблицы, но ТОЛЬКО из файлов PDF. Проблема в том, что из-за ограничений приложения (и нет, я не могу их изменить; это ошибка в коде, над которым работает разработчик программного обеспечения), это позволит мне получить только одно имя файла на столбец в результаты приложения отображаются вместо простого отображения всех имен файлов, связанных с этой записью, в одном столбце, разделенных запятой, и т. д. c.

Я просто хочу, чтобы приложение извлекало имена файлов, если файл представляет собой PDF, однако для того, чтобы вообще извлекать имена файлов в это приложение, я должен определить уникальное качество для номера записи, которое в данном случае порядковый номер (seqno). Я хочу написать заявление, которое гласит: «тянуть это имя файла по порядковому номеру, если файл является PDF», которое не приводит к пустым столбцам. Итак, другими словами, если к этой записи прикреплено пять файлов, а два - в формате PDF, мне не нужны пять столбцов, три из которых пустые, а два - с отображаемыми данными. Я хочу, чтобы только имена файлов были доставлены в первые два столбца. Если к следующей записи прикреплено пять файлов и три файла формата PDF, файлы должны отображаться в следующих трех столбцах.

enter image description here

Ниже приведен исходный код. Он просто находит все файлы, прикрепленные к записи, извлекает информацию об имени файла из dbo.FILE и информацию об имени записи из R.FILE_REV и назначает одно имя файла на столбец по порядковому номеру (номер R.SEQNO, очевидно, увеличивается на 1 для каждого столбца). Этот код работает отлично; Я просто хочу иметь возможность не печатать его снова и снова и иметь пустые столбцы, если случится так, что файл с seq_no 2 не является PDF.

SELECT F.FILENAME
FROM dbo.FILE F,
     dbo.FILE_REV R
WHERE F.FILE_NO = R.FILE_NO
  AND R.RECORD_NO = {RECORD_NO}
  AND R.SEQNO = '1'

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Поскольку порядковый номер (seqno) может не быть последовательным, вам нужно создать последовательный номер, используя оконную функцию ROW_NUMBER(). Затем вы можете повернуть данные в нужную форму.

Например:

select
  record_no,
  max(case when rn = 1 then f.filename end) as associated_file_1,
  max(case when rn = 2 then f.filename end) as associated_file_2,
  max(case when rn = 3 then f.filename end) as associated_file_3
from (
  select 
    r.record_no,
    f.filename,
    row_number() over(order by r.seqno) as rn
  from dbo.file f
  left join dbo.file_rev r on r.file_no = r.file_no
  where r.record_no = {record_no}
    and f.filename like '%.pdf'
) x
group by record_no
1 голос
/ 05 февраля 2020

Вы можете присоединиться и сделать условное агрегирование:

select
    r.record_no,
    max(case when r.seqno = 1 then f.filename end) associated_file_1,
    max(case when r.seqno = 2 then f.filename end) associated_file_2,
    max(case when r.seqno = 3 then f.filename end) associated_file_3
from dbo.file_rev r
left join dbo.file f
    on  f.file_no = r.file_no
    and f.filename like '%.pdf'
group by r.record_no
...