这一定是一种更好的SQL WHERE/IN s方式

这一定是一种更好的SQL WHERE/IN s方式,sql,oracle,Sql,Oracle,我必须测试Select语句返回的Where/In子句,该子句非常笨拙。我敢肯定,如果有成千上万的数字要核对,情况可能会更糟,但对我来说,这看起来很糟糕,尽管事实上它是有效的 Where p.description Like '%UbD%' Or pa.text Like '%UbD%' And p.state_code_id IN ('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18'

我必须测试Select语句返回的Where/In子句,该子句非常笨拙。我敢肯定,如果有成千上万的数字要核对,情况可能会更糟,但对我来说,这看起来很糟糕,尽管事实上它是有效的

Where p.description Like '%UbD%'
  Or pa.text Like '%UbD%'
And p.state_code_id IN ('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50','65')
我怎样才能让对账单检查像'1-50','65'之类的东西呢?可能吗?我正在使用oracle。

试试这个:

Where p.description Like '%UbD%'
  Or pa.text Like '%UbD%'
  And ((p.state_code_id BETWEEN 1 AND 50) OR p.state_code_id = 65)

假设状态代码为正且不为0,则可以使用:

AND (p.state_code_id <= 50
     OR p.state_code_id = 65)

和(p.state\u code\u id不更改查询,但使其更易于维护。将数据放入表中并使用子查询

Where p.description Like '%UbD%'
  Or pa.text Like '%UbD%'
And p.state_code_id IN (SELECT ID FROM States)

如果你的代码总是相同的,按照其他人说的去做。如果他们不同,那么创建一个临时表。将所有需要的值插入到新的(临时表)中,并对这两个表进行连接

SELECT p.* 
FROM p, temp 
WHERE p.description Like '%xyz%' AND p.state_code == temp.code

尝试
(p.state\u代码介于'1'和'50'之间或p.state\u代码=='65')
虽然in并不理想,但我认为您应该从无法使用索引的通配符搜索中获得更高的性能。您可以添加一个内部联接,这将限制数据,但您首先必须以某种方式获得集合1-50和65,这将依赖于其他数据…sql应该使用=,而不是==(只是一张纸条——我相信你知道的)世界上有谁在发布后不到一秒钟内就对正确答案进行了批改?所有的否决票(其中一些后来被撤回)发生在回答缺少括号或不完整的问题上。我发现现在-百万倍于其他人来解释你自己的问题。旁白:当人们没有帮助OP或回答者知道问题所在,帮助他们改进他们的帖子时,我总是很恼火。@jmadsen-有些人根本没有足够的事情做。假设没有字段中没有负数或0。这对我来说并不奇怪,我见过一些代码出于某种原因使用负数作为状态。这取决于代码是否更改。如果更改了,那么这比创建一个巨大的查询要容易得多。你可以让临时表一直存在,只是空的。足够公平-对于动态查询来说rk,但在过去我刚刚创建了一个(php for me)函数将其拆分为语句。事实上,你的是我的第一个想法。我以前也做过语句。然后我从ubuntu转到Windows Server,突然MySQL在我庞大的查询中消失了。这就是为什么我意识到我的技术有点不对劲:我几乎肯定你可以安全地使用
和p.state\u code\u id在1和65之间
@tftd,但这将包括51和64之间的值,OP不希望这样……我错过了问题中的这一部分。:)如果p.STATE_代码的所有值都是数字,这将起作用。如果p.STATE_代码中有任何字母值,它将由于数字转换错误而失败。共享并享受。+1,我的想法正是如此,很高兴有人这么说(或者类似地,加入ref表)
SELECT p.* 
FROM p, temp 
WHERE p.description Like '%xyz%' AND p.state_code == temp.code