【问题标题】:Short SQL command to return true if no field contains a string?如果没有字段包含字符串,则返回 true 的短 SQL 命令?
【发布时间】:2012-05-07 13:56:15
【问题描述】:

我想要一个简短形式的 SQL 命令(我正在使用 Oracle SQL)

SELECT * from table1 
WHERE field1 not like '%test%' 
AND field2 not like '%test%' 
AND field3 not like '%test%'

是否有与该命令等效的语法?我在考虑类似的事情

SELECT * from table1 
WHERE '%test%' not in (field1, field2, field3)

但不幸的是,这种语法不起作用?!非常感谢所有提示和建议。

【问题讨论】:

  • 不能在IN 子句中使用通配符——我知道的每个数据库都支持第一个查询。
  • 我不认为这样的语法存在,如果有人知道我会很高兴学习..

标签: sql sql-server database oracle


【解决方案1】:

对不起,伙计,我认为您找不到比问题中的第一个陈述更短或更简单的陈述。

【讨论】:

    【解决方案2】:

    不,这不可能。

    使用De Morgan's laws 之一的这种转换非常短,但只有几个字符差异:

    SELECT *
    FROM table1 
    WHERE NOT (field1 LIKE '%test%' OR
               field2 LIKE '%test%' OR 
               field3 LIKE '%test%')
    

    还有一个更短的 hack,但我建议不要这样做,因为如果您将字符串文字 '%test%' 更改为,它会降低查询的性能并引入错误的可能性可能包含下划线的内容,例如'%te_st%':

    SELECT *
    FROM table1 
    WHERE (field1 + '_' + field2 + '_' + field3) NOT LIKE '%test%'
    

    我认为你已经在做的是最好的解决方案。

    【讨论】:

    • 我通常发现 charindex() 或 instr() 比“like”更快。如果性能是一个问题,您可以尝试“charindex('test', Field1) > 0”,而不是像 '%test%' 这样的 Field1。
    【解决方案3】:
    SELECT CASE WHEN (
        (field1 NOT LIKE '%test%') AND
        (field2 NOT LIKE '%test%') AND
        (field3 NOT LIKE '%test%')
    THEN true
    ELSE false AS truthiness
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 2012-02-19
      • 2014-10-30
      相关资源
      最近更新 更多