3 строки уточнения SQL
У меня проблема с отчетом, который работает на сайте, где данные не обрабатываются должным образом. В частности, есть выпадающие настройки с tlist, датами From и To, студентами и спортом. Проблема связана с выпадающим или спортивным выпадающим списком.
Раскрывающийся
<select id="lt" name="lt">
<option value="-1" selected="selected">All Sports</option>
~[tlist_sql;
SELECT DISTINCT log.logtypeid,
CASE WHEN log.subtype is null THEN ' ' ELSE log.subtype END subID,
CASE WHEN ','||'~[gpv:lt]'||',' LIKE '%,' || log.subtype || '.' || CASE WHEN
log.subtype is null THEN ' ' ELSE log.subtype END || ',%' THEN 'selected' ELSE '' END isselected,
lt.Name logtype,
CASE WHEN to_char(st.ValueT) is null THEN ' - NONE' ELSE ' - ' || to_char(st.ValueT) END subtype
FROM log
INNER JOIN gen lt ON log.logtypeid = lt.id
LEFT OUTER JOIN gen st ON st.Name = to_char(lt.ID)
AND st.value = log.subtype
AND st.Cat = 'subtype'
WHERE lt.Cat = 'logtype'
AND log.logtypeid = '3935'
AND to_char(log.schoolid) like CASE WHEN ~(curschoolid) = 0 THEN '%' ELSE to_char(~(curschoolid)) END
ORDER BY subtype
;]
<option value="~(logID;l).~(subtypeID;t)" ~(isselected;t)>~(LogType;t)~ (SubType;t)</option>
[/tlist_sql]
Выход
~[tlist_sql;
SELECT s.Student_Number, s.grade_level, s.lastfirst student, to_char(st.ValueT) subtype, log.discipline_weapontype,
CASE WHEN log.discipline_hearingofficerflag = '1' THEN 'Yes' ELSE ' ' END as pp,
CASE WHEN log.discipline_weaponrelatedflag = '1' THEN 'Yes' ELSE ' ' END as ss,
DBMS_LOB.SUBSTR(log.entry, 4000,1) Notes
FROM log
INNER JOIN students s ON log.studentid = s.id
~[if#cursel.~[gpv:studentID]=cur]INNER JOIN ~[temp.table.current.selection:students] temp ON temp.dcid=s.dcid[/if#cursel]
INNER JOIN gen lt ON log.logtypeid = lt.id
LEFT OUTER JOIN gen st ON st.Name = to_char(lt.ID)
AND st.value = log.subtype
AND st.Cat = 'subtype'
AND lt.Cat = 'logtype'
WHERE studentid IN
(SELECT studentid
FROM log
WHERE subtype IN
(SELECT subtype
FROM log
WHERE logtypeid = '3935'))
AND subtype IN ('29','43','100','101','102','104','105','106','107','109','110','111','112','113','114','115','116','117','119','120','121','122','123','125','126','127','128','129','130','131','132','133')
AND log.entry_date >= to_date('~[gpv:dateselect]','MM/DD/YYYY')
AND log.entry_date <= to_date('~[gpv:dateselect2]','MM/DD/YYYY')
AND
~[if#cursel.~[gpv:studentID]#cur]
to_char(s.ID) LIKE CASE WHEN '~[gpv:studentID]' = '-1' THEN '%' ELSE '~[gpv:studentID]' END
[/if#cursel]
AND (
(','||to_char('~[gpv:lt]')||',' LIKE '%,' || to_char(log.logtypeid) || '.' || CASE WHEN log.subtype is null THEN ' ' ELSE log.subtype END || ',%')
OR (','||to_char('~[gpv:lt]')||',' LIKE '%,' || to_char(log.logtypeid) || '.-1,%')
OR (to_char(log.logtypeid) LIKE CASE WHEN to_char('~[gpv:lt]') = '-1' THEN '%' ELSE ','||to_char('~[gpv:lt]')||',' END)
)
ORDER BY s.lastfirst, log.entry_date;alternatecolor]
<tr class="oddRow">
<td>~(count;-)</td>
<td name="stNumCol">~(stNum;t)</td>
<td name="gradeCol">~(grade;t)</td>
<td name="studentCol">~(Student;t)</td>
<td name="subtypeCol">~(st;t)</td>
<td name="dopCol">~(date of physical;t) </td>
<td name="ppCol">~(parent perm.;t) </td>
<td name="ssCol">~(student signa.;t)</td>
<td name="notesCol">~(notes;t)</td>
</tr>
[/tlist_sql]
Когда отчет запускается с выбранным All Sports, он вытягивает всех студентов, у которых есть спортивные журналы.
log.logtypeid = '3935'
или они также могут быть
log.subtype IN ('100','101','102','104','105','106','107','109','110','111','112','113','114','115','116','117','119','120','121','122','123','125','126','127','128','129','130','131','132','133')
Необходимо извлечь другой набор данных, подтипы "29" и "43", которые являются журналами работоспособности. Код 29 запрещает кому-либо возможность попробовать себя в спорте, а код 43 - ему.
Проблема
При запуске All Sports отображаются все учащиеся со спортивными журналами, а также отображаются коды этих учеников 29 и 43, но при выборе отдельного вида спорта из выпадающего списка не отображаются подтипы журнала здоровья этих учеников 29 и 43.
Любые советы или предложения будут оценены. Спасибо
1 ответ
Вот как читать символы, с которыми у вас проблемы:
- || обозначает конкатенацию в Oracle (а также в таких языках, как Java и C#), поэтому в любом месте, где вы видите || между двумя утверждениями означает, что система читает их как одно.
- Операторы case - это, по сути, операторы if/then для SQL. В кейсе определяется, что нужно исследовать, а затем когда и остальное указывает, что делать с конкретными сценариями.
- Список операторов to_char ('') размещает определенное форматирование символов в окружающей строке, которая, скорее всего, используется для объединения метаданных.
- % является символом подстановки, который требуется для операторов LIKE
Этот код имеет немного больше смысла, когда вы меняете форматирование:
AND (
(','||to_char('~[gpv:lt]')||',' LIKE '%,' || to_char(log.logtypeid) || '.' ||
CASE WHEN log.subtype is null
THEN ' '
ELSE log.subtype
END || ',%')
OR (','||to_char('~[gpv:lt]')||',' LIKE '%,' || to_char(log.logtypeid) || '.-1,%')
OR (to_char(log.logtypeid) LIKE
CASE
WHEN to_char('~[gpv:lt]') = '-1'
THEN '%'
ELSE ','||to_char('~[gpv:lt]')||','
END)
)
Так что в основном это проверка значений gpv:lt
LIKE
значения log.logtypeid
а также log.subtype
(когда есть подтип - он не равен нулю) OR
это проверяет gpv:lt
LIKE
log.logtypeid.-1
OR
где log.logtypeid
LIKE
что-нибудь, когда gpv:lt = -1
или = к gpv:lt
если нет = 1.
Обратите внимание, что я понятия не имею, что это значит для вашего приложения / отчета, поскольку я не понимаю логику того, что вы пытаетесь выполнить... но, надеюсь, это утверждение на английском языке выше поможет вам перевести вашу проблему.