我有这个表"Table"
的内容:
+--------+
| 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
我必须要比较最多的30个数字。
像这样的东西
SELECT Serial FROM Table WHERE Serial LIKE IN ('D100M', 'D200M')
答案 0 :(得分:4)
最简单的方法是:
SELECT Serial
FROM Table
WHERE upper(Serial) in ('D100M', 'D200M');
然而,这不会在serial
列上使用索引。
因此,如果需要考虑性能,则需要在upper(serial)
上创建索引。
答案 1 :(得分:2)
SELECT Serial FROM Table WHERE Serial IN ('D100M', 'D200M',<addAllSerialsHereCommaSeparated>)
更新: 如果应以大写形式检查所有序列号,则可以使用:
SELECT Serial FROM Table WHERE upper(Serial) IN ('D100M', 'D200M',<addAllSerialsHereCommaSeparated>)
答案 2 :(得分:1)
只要您不使用通配符或其他like
运算符字符,就可以使用此脚本:
SELECT Serial FROM Table WHERE upper(Serial) IN ('D100M', 'D200M')
另外,您需要全文搜索。
答案 3 :(得分:1)
我假设您想要忽略大小写来获取记录。 您可以使用大写或小写功能,并执行以下操作:
SELECT Serial FROM Table WHERE Upper(Serial) IN ('D100M', 'D200M')
或者
SELECT Serial FROM Table WHERE Lower(Serial) IN ('d100m', 'd200m')
答案 4 :(得分: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值中的最终选择将转换为upper,然后作为列返回。
最后它作为迷你表提供给IN子句......
这是Oracle特定的。
在MS SQL的情况下,此链接可能对执行相同的操作有用...: http://sqljason.com/2010/05/converting-single-comma-separated-row.html
答案 5 :(得分:0)
您可以检查以下内容:
SELECT Serial
FROM Table
WHERE (Serial collate SQL_latin1_general_cp1_cs_as)
IN ('D100M', 'D200M', 'd200m');
它应该获得正确和所需的信息。