【问题标题】:SQL filter out string that matches condition and with specific exception to passSQL 过滤掉匹配条件的字符串,并且有特定的异常通过
【发布时间】:2021-02-24 16:14:32
【问题描述】:

样本数据

| data_col            | 
| --------------------| 
| Realdata            |
| Firsttest           | 
| testSecond          | 
| onetesttwo          | 
| exceptiontestunique | 
| legitdata           | 

我想过滤掉所有包含 test 的数据,除了一个

我的预期返回结果是:

Realdata
exceptiontestunique
legitdata

我可以像这样在 PHP 中编写代码。

if (strpos($data, 'test') === false || $data === 'exceptiontestunique') return $data;

或者像这样在 JavaScript 中

if (data.indexOf('test') === -1 || data === 'exceptiontestunique') {
  return data;
}

但我在 SQL 中需要它

WHERE data_col NOT LIKE '%test%'
???????

const datas = ['realdata', 'Firsttest', 'testSecond', 'onetesttwo', 'exceptiontestunique', 'legitdata'];

const filtered = datas.filter(data => {
  if (data.indexOf('test') === -1 || data === 'exceptiontestunique') {
    return data;
  }
})

console.log(filtered);

【问题讨论】:

  • 不一定不喜欢,只要预期的返回结果好就行
  • 条件是什么?获取test 是单词开头的一部分还是结尾的一部分?如果test 在中间的某个地方,不要返回那个值?
  • @FaNo_FN 我已经更新了问题并添加了一个示例。

标签: mysql sql filter


【解决方案1】:

我可以看到,在您的 PHP/Js 代码中,您定义了两个条件;任何包含“测试”但不包含exceptiontestunique 的值。有了这样的特定条件,您可以使用OR 来实现。示例:

SELECT * FROM table1
WHERE (data_col NOT LIKE '%test%' 
            OR data_col='exceptiontestunique');

Demo Fiddle

【讨论】:

  • 非常感谢。完美的!!我对 NOT LIKE 与 OR 的组合感到困惑
【解决方案2】:

你可以使用union all:

SELECT t.*
FROM T
WHERE data_col NOT LIKE '%test%'
UNION ALL
(SELECT t.*
 FROM T
 WHERE data_col LIKE '%test%'
 LIMIT 1
);

通常,LIMITORDER BY 一起使用,但您似乎并不关心 您会得到哪个“测试”。

【讨论】:

  • 您好,我更新了问题以使其更加清晰,使用 PHP 和 Javascript 中的示例,我还添加了一个代码 sn-p 来运行,希望对您有所帮助,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
相关资源
最近更新 更多