2016-11-24 86 views
-2

不敏感的我有这个表"Table"与内容:SQL情况下,搜索

+--------+ 
| Serial | 
+--------+ 
| d100m | <- expected result 
| D100M | <- expected result 
| d200m | <- expected result 
| d300L | 
| D400R | 
+--------+ 

有储存情况不准确的序列号。

目前,我有一份声明中选择有像

SELECT Serial FROM Table WHERE Serial LIKE 'D100M' OR Serial LIKE 'D200M'; 

但不存在,而不是一个简单的方法OR Serial LIKE OR Serial LIKE OR Serial LIKE有alomst 30号我有比较。

像这样的事情

SELECT Serial FROM Table WHERE Serial LIKE IN ('D100M', 'D200M') 
+0

'WHERE串行IN( 'D100M', 'D200M')' –

+0

@SalmanA不匹配' d100m' – Toshi

+3

您正在使用哪些DBMS? –

回答

1

最简单的方法是:

SELECT Serial 
FROM Table 
WHERE upper(Serial) in ('D100M', 'D200M'); 

然而,这不会使用serial列中的索引。

因此,如果性能是一个问题,您需要在upper(serial)上创建索引。

1
SELECT Serial FROM Table WHERE Serial IN ('D100M', 'D200M',<addAllSerialsHereCommaSeparated>) 

UPDATE: 如果所有连续应以大写字母来检查,你可以使用:

SELECT Serial FROM Table WHERE upper(Serial) IN ('D100M', 'D200M',<addAllSerialsHereCommaSeparated>) 
+0

虽然这种情况如何不敏感? –

+1

如果我理解正确,不敏感意味着,不需要检查低位或大写。所以你可以把所有的字符串都转换成大写来检查,不是吗? –

+0

强制一个特定的情况下,这意味着你不需要考虑小写,这是一个非常好的可怜的人不区分大小写检查,con是你的检查需要大写,但你必须写他们,所以这是一个非常小的问题 – kyle

0

只要你不使用通配符或其他like运营商的字符,你可以使用这个脚本:

SELECT Serial FROM Table WHERE upper(Serial) IN ('D100M', 'D200M') 

其他明智的,你需要一个全文检索。

0

我假设你想要忽略案件的记录。 您可以使用大写或小写功能,做一些事情,如:

SELECT Serial FROM Table WHERE Upper(Serial) IN ('D100M', 'D200M') 

或者

SELECT Serial FROM Table WHERE Lower(Serial) IN ('d100m', 'd200m') 
0

使用下面的查询格式:

select * from dual where upper(DUMMY) in (SELECT upper(x.split_values) 
FROM 
    (WITH T AS 
    (SELECT 'A,B,C,D,E,F' STR FROM DUAL 
) 
SELECT REGEXP_SUBSTR (STR, '[^,]+', 1, LEVEL) SPLIT_VALUES 
FROM T 
    CONNECT BY LEVEL <= 
    (SELECT LENGTH (REPLACE (STR, ',', NULL)) FROM T 
) 
) x 
) 

IN子句中的查询转换你的逗号分隔的列表到行... x.split值中的最终选择被转换为上限,然后以列的形式返回。

终于将其提​​供给IN子句作为一个小型表...

这是甲骨文具体。

在MS SQL的情况下,这链路可以是执行相同OPS有用...: http://sqljason.com/2010/05/converting-single-comma-separated-row.html