SQL在搜索中不区分大小写
我有一张包含以下内容的表格:SQL在搜索中不区分大小写,sql,sql-like,Sql,Sql Like,我有一张包含以下内容的表格: +--------+ | Serial | +--------+ | d100m | <- expected result | D100M | <- expected result | d200m | <- expected result | d300L | | D400R | +--------+ 但是有没有一种更简单的方法来代替或类似于序列号或类似于序列号或类似于序列号我有30个数字要比较 像这样的 SELECT Serial FR
+--------+
| Serial |
+--------+
| d100m | <- expected result
| D100M | <- expected result
| d200m | <- expected result
| d300L |
| D400R |
+--------+
但是有没有一种更简单的方法来代替或类似于序列号或类似于序列号或类似于序列号我有30个数字要比较
像这样的
SELECT Serial FROM Table WHERE Serial LIKE IN ('D100M', 'D200M')
更新:
如果所有序列都应以大写形式进行检查,则可以使用:
SELECT Serial FROM Table WHERE upper(Serial) IN ('D100M', 'D200M',<addAllSerialsHereCommaSeparated>)
最简单的方法是:
SELECT Serial
FROM Table
WHERE upper(Serial) in ('D100M', 'D200M');
但是,它不会在序列列上使用索引
因此,如果性能是一个问题,则需要在upperserial上创建索引。只要不使用通配符或其他类似的运算符字符,就可以使用以下脚本:
SELECT Serial FROM Table WHERE upper(Serial) IN ('D100M', 'D200M')
另一方面,您需要进行全文搜索。我假设您希望在忽略案例的情况下获取记录。 您可以使用upper或lower函数并执行以下操作:
SELECT Serial FROM Table WHERE Upper(Serial) IN ('D100M', 'D200M')
或
使用以下查询格式:
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子句
这是特定于Oracle的
对于MS SQL,此链接可能有助于执行相同的操作…:
您可以检查以下内容:
SELECT Serial
FROM Table
WHERE (Serial collate SQL_latin1_general_cp1_cs_as)
IN ('D100M', 'D200M', 'd200m');
它应该得到正确和所需的信息。在'D100M'、'D200M'@SalmanA中,序列号与D100M不匹配。您使用的是哪种DBMS?您可以有一个单独的、附加的序列号搜索列,其中每个值都以大写和小写存储lowercase@SalmanA:这在很大程度上取决于所使用的DBMS。默认情况下,Postgres、Firebird、Oracle和DB2区分大小写。但是,这是如何区分大小写的呢?如果我理解正确,不区分大小写意味着,不必检查小写或大写。所以你可以把所有的字符串都转换成大写来检查,不是吗?强制一个特定的大小写,这意味着你不需要考虑小写,这是一个非常好的不区分大小写的检查,con是你的检查需要大写,但你必须写它们,所以这是一个非常小的问题
SELECT Serial FROM Table WHERE Lower(Serial) IN ('d100m', 'd200m')
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
)
SELECT Serial
FROM Table
WHERE (Serial collate SQL_latin1_general_cp1_cs_as)
IN ('D100M', 'D200M', 'd200m');