Я предпочитаю делать «PAD» для данных. MySql называет его LPAD, но вы можете обойтись и сделать то же самое в SQL Server.
ORDER BY REPLACE (STR (ColName, 3), SPACE (1), '0')
Эта формула предоставит ведущие нули на основе длины столбца 3. Эта функциональность очень полезен в других ситуациях вне ORDER BY, поэтому я хотел бы предоставить эту опцию.
Результаты: 1 становится 001, а 10 становится 010, а 100 остается неизменным.
Так как вы не можете использовать If внутри выражения, вы можете написать свой sql следующим образом:
DECLARE @source as NVARCHAR(MAX) = (SELECT md.[source] FROM sports_service.meet.meet_detail md WHERE md.meet_id = #{meetId})
WHERE reg.is_waitlist = 0 AND reg.cancelled_dt IS NULL
AND NOT EXISTS (
SELECT
1
FROM
sports_service.meet.meet_invitations i
WHERE
i.meet_id = pmm.meet_id
AND i.sports_person_id = reg.sports_person_id)
AND ( @source <> 'MANUAL'
AND
EXISTS ( SELECT 1 FROM
sports_service.meet.session session
INNER JOIN sports_service.meet.event event ON
event.session_id = session.id
WHERE
pmm.meet_id = session.meet_id
AND sports_service.dbo.fnGetMeetAge(p.birth_dt,
detail.age_up_date,
detail.id_format) >= event.low_age
AND sports_service.dbo.fnGetMeetAge(p.birth_dt,
detail.age_up_date,
detail.id_format) <= event.high_age
AND (event.eligible_gender IS NULL
OR event.eligible_gender = p.gender)))
Если вы хотите проверить какое-то условие (условие AND EXISTS ...
), только если выполняется какое-то другое условие (источник - MANUAL
), и вы хотите сделать это в одном запросе вместо:
WHERE (...some condition ...) AND (.. some other condition ... )
IF @source != 'MANUAL'
AND EXISTS (
SELECT 1 ... )
который не поддерживается, так как это неправильный синтаксис sql, который вы можете сделать:
WHERE (...some condition ...) AND (.. some other condition ... )
AND (
(
(SELECT md.[source]
FROM sports_service.meet.meet_detail md
WHERE md.meet_id = #{meetId}
) = 'MANUAL'
)
OR EXISTS (
SELECT 1
FROM ...
)
)
Вам нужно проверить, будет ли производительность результирующего запроса удовлетворительной.
Вероятно, было бы лучше выполнить запрос, который сначала получает source
, а затем выполнить любой запрос с дополнительным условием или без него в зависимости от значения source
. Для этого вы можете сгенерировать запрос в mybatis, используя динамический SQL (включая или исключая это дополнительное условие).