【问题标题】:Select a row that matches one condition, or else a row that matches another condition选择与一个条件匹配的行,或者选择与另一个条件匹配的行
【发布时间】:2020-03-26 21:49:15
【问题描述】:

我有一个看起来像这样的表:

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') 之前执行,从而导致返回错误的行。

如何确保我的条件始终以正确的顺序执行?

【问题讨论】:

    标签: sql sqlite sql-order-by where-clause


    【解决方案1】:

    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 '%*' 上可能匹配的行进行优先级排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      相关资源
      最近更新 更多