在MySQL中选择查询,检查字符串或在where子句中检查是否为true?

vis*_*nth 5 mysql sql select where mysql-workbench

请考虑下表:

SELECT id, Bill_Freq, Paid_From, Paid_To, Paid_Dt, rev_code FROM psr_20160708091408;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

要求是获取已rev_code填充字符串**SUM**的行.我还注意到,对于rev_code填充为**SUM**的每一行,它Bill_Freq都不会为null或零.

所以我写了两个查询来获取id最低的行

基于where子句中的字符串检查查询:

select
        min(id) as head_id,
        bill_freq,
        Paid_From,
        Paid_To,
        Paid_Dt
from
    `psr_20160708091408` where rev_code = "**SUM**";
Run Code Online (Sandbox Code Playgroud)

基于真实条件的查询:

select
    min(id) as head_id,
        bill_freq,
        Paid_From,
        Paid_To,
        Paid_Dt
from
    `psr_20160708091408` where bill_freq;
Run Code Online (Sandbox Code Playgroud)

我没有看到有人使用第二种类型,想知道它的可靠性和失败的情况.

Gor*_*off 1

如果“第二种类型”是指where没有明确条件的子句,那么您有充分的理由看不到它。

SQL 标准以及大多数数据库需要在where. MySQL 允许您使用简写,但它的真正含义是:

where not billing_freq <=> 0
Run Code Online (Sandbox Code Playgroud)

或等价:

where billing_freq <> 0 or billing_freq is null
Run Code Online (Sandbox Code Playgroud)

(这<=>是空安全比较运算符。

您的查询更重要的问题是min(). 我认为您实际上想要这个:

select p.*
from psr_20160708091408 p
where rev_code = '**SUM**'
order by id
limit 1;
Run Code Online (Sandbox Code Playgroud)

另外,您应该使用单引号作为字符串分隔符。这是 ANSI 标准,很少有理由使用双引号。