【问题标题】:my sql query get all rows under certain conditions of where clause我的sql查询在where子句的某些条件下获取所有行
【发布时间】:2014-08-26 04:13:24
【问题描述】:

下面有我的 sql 查询,

select SQL_CALC_FOUND_ROWS * from `MYDATABASE`.`MYTABLE` 
   WHERE (Date(timestamp) BETWEEN '1970-01-01' and '2014-08-25') 
      and (COLA='') and (COLB = '') and COLC = '1' 
        AND (LIKE CLAUSE ON ANOTHER 10 COLUMNS) desc Limit  0, 10 ;

现在对于 ColA 和 COLB ,我有时会填充值,有时这些值要么是空字符串,要么是 Null 值,所以每当我得到这些值时,我的查询都不会返回任何行。我可以理解为什么我没有得到任何行,但是现在我的要求是每当我为这些列中的任何一个获取空值或空字符串时获取所有行。

我该怎么做?我尝试使用 is not Null,但这会破坏我的代码,因为当我将 null 值传递给 COLA 和 COLB 时它可能会起作用,但是当 COLA 具有有效值并且 COLB 传递为 null 时,它仍然会在我希望它满足 COLA 条件时提供所有记录?抱歉,我没有任何 DBA,因为我现在身兼数职。

实际查询如下所示,

select SQL_CALC_FOUND_ROWS * from `MYDATABASE`.`MYTABLE` 
   WHERE (Date(timestamp) BETWEEN '1970-01-01' and '2014-08-25') 
      and (COLA='someparameter captured from UI,it could be null or empty string') and (COLB = 'someparameter captured from UI,it could be null or empty string') and COLC = '1' 
        AND (LIKE CLAUSE ON ANOTHER 10 COLUMNS) desc Limit  0, 10 ;


select SQL_CALC_FOUND_ROWS * from MYTABLE WHERE (Date(timestamp) BETWEEN '1970-01-01' and 'CURRENTDATE') and COLA = ('12001'OR'12002') and COLB = ('VAL1'OR 'VAL2' OR 'VAL3' OR 'VAL4'OR 'VAL5'OR 'VAL6') and COLC = '1' and (COLD LIKE '%%' OR COLE LIKE '%%' OR COLF LIKE '%%' OR COLG LIKE '%%'  OR COLH LIKE '%%' OR COLI LIKE '%%' OR COLM LIKE '%%' OR COLN LIKE '%%' OR COLP LIKE '%%')  order  by Date(timestamp) desc Limit  0, 100

【问题讨论】:

  • 从哪里获得 where 子句的值以及如何创建此语句(代码?)
  • 显示你的数据,需要更清楚的问题..!!
  • 我有一个 java 类,它从 UI 中捕获值。此查询是 DAO 类的一部分。
  • Mahida,请说明您需要什么数据,COLA和COLB是字符串,在数据库中映射为varchar。
  • 请检查我的答案。如果是这样,您应该仅根据最后一条 sql 简化您的问题。其他两个 sql 模板可能与您的问题无关。

标签: mysql


【解决方案1】:

这样试试

select SQL_CALC_FOUND_ROWS * from `MYDATABASE`.`MYTABLE` 
WHERE (Date(timestamp) BETWEEN '1970-01-01' and '2014-08-25') 
and (COLA IS NULL OR COLA = '') and (COLB IS NULL OR COLB = '') and COLC = '1' 
AND (LIKE CLAUSE ON ANOTHER 10 COLUMNS) desc Limit  0, 10 ;

【讨论】:

  • 抱歉回复晚了。 Satish 甚至这个查询也没有给我任何结果。所以我最终通过其他方式实现了解决方法。我在代码中添加了额外的检查
  • 每当 colA 显示为空或 null 时,我都会执行一些类似 COLA = (Value1 OR Value2 or Value3) 的操作,对 COL B 执行相同操作。这种方法的唯一缺点是我需要知道 COLA 和 COLB 中所有可能的值。
  • @KiranBadi 你能提供输入和样本输出吗
  • Sathish,我刚刚用查询更新了帖子。 COLA 和 COLB 在我的 java 代码中被格式化,它检查 value 是 null 还是空,否则这个 value 传递实际值。
【解决方案2】:

你应该知道'12001'OR'12002'是一个逻辑表达式,它返回一个布尔值(Mysql中的0-false/1-true)。

select ('12001'OR'12002'), 1=('12001'OR'12002'), '1'=('12001'OR'12002'), '0'=('12001'OR'12002')

('12001'OR'12002') | 1=('12001'OR'12002') | '1'=('12001'OR'12002') | '0'=('12001'OR'12002')|
-------------------|----------------------|------------------------|-----------------------|
                  1|                     1|                       1|                      0|

所以COLA = ('12001'OR'12002') 将为假,除非COLA=1COLA='1'

你应该改变你的java代码,用in而不是=,而不是OR来生成SQL语句:

COLA in ('12001','12002') 

【讨论】:

  • 嗨,Jaugar,我知道它们是合乎逻辑的表达,但是啊哈,我知道你想告诉我什么。我将对代码进行更改并尝试使用 IN。希望它不会破坏我的 DAO。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 2017-09-16
相关资源
最近更新 更多