Выберите строку, которая соответствует одному условию, или строку, которая соответствует другому условию - PullRequest
1 голос
/ 27 марта 2020

У меня есть таблица, которая выглядит примерно так:

ID    A        B       C 
1     'jack'   10      '12'
2     'steve'  0       '20'
3     'jack'   20      '13'
4     'jack'   20      '12 *'
5     'steve'  5       '30 *'

Теперь я хочу выбрать одну строку, соответствующую следующим условиям:

  1. A = @A
  2. B = @ B
  3. В случае, если условие № 2 не может быть выполнено: C LIKE '% *'

Пример 1:

@A = 'jack'
@B = '10'

Строки 1, 3 и 4 соответствуют условию # 1. Строка 1 также соответствует условию # 2, поэтому строка возвращается.

Пример 2:

@A = 'steve'
@B = '10'

Строки 2 и 5 соответствуют условию # 1. Ни один из них не соответствует условию №2, но строка 5 соответствует условию №3, поэтому строка возвращается.

Пока у меня есть SQL оператор, который работает:

select * from table where A='steve' and (B='10' or C like '%*') limit 1

Проблема с этим решением заключается в том, что я не уверен, какой заказ B='10' or C like '%*' выполнен. Если они всегда выполняются слева направо, то это будет работать. Но если по какой-то причине это не всегда так, то условие № 3 (C like '%*') может быть выполнено до условия № 2 (B='10'), что приведет к возвращению неправильной строки.

Как можно Я уверен, что мои условия всегда выполняются в правильном порядке?

1 Ответ

1 голос
/ 27 марта 2020

Логика фильтрации c в предложении where выглядит хорошо.

Я думаю, что проблема, которую вы хотите решить, состоит в том, как расставить приоритеты для результатов, когда есть совпадение при условии 2, а другое при условии 3.

Я думаю, что вы можете решить эту проблему с помощью сортировки и предел:

select * 
from mytable 
where a = 'steve' and (b = '10' or c like '%*') 
order by case when b = '10' then 0 else 1 end
limit 1

Приоритет строки, совпадающей с b = 10, отдается с возможным совпадением с c like '%*'.

...