我很难让我的DB2(AS / 400)查询不区分大小写。
例如:
SELECT *
FROM NameTable
WHERE LastName = 'smith'
不会返回任何结果,但以下内容会返回1000的结果:
SELECT *
FROM NameTable
WHERE LastName = 'Smith'
我已经读过将SortSequence / SortType放入你的连接字符串但是没有运气......有人对此有所了解吗?
编辑:
这是存储过程:
BEGIN
DECLARE CR CURSOR FOR
SELECT T . ID ,
T . LASTNAME ,
T . FIRSTNAME ,
T . MIDDLENAME ,
T . STREETNAME || ' ' || T . ADDRESS2 || ' ' || T . CITY || ' ' || T . STATE || ' ' || T . ZIPCODE AS ADDRESS ,
T . GENDER ,
T . DOB ,
T . SSN ,
T . OTHERINFO ,
T . APPLICATION
FROM
( SELECT R . * , ROW_NUMBER ( ) OVER ( ) AS ROW_NUM
FROM CPSAB32.VW_MYVIEW
WHERE R . LASTNAME = IFNULL ( @LASTNAME , LASTNAME )
AND R . FIRSTNAME = IFNULL ( @FIRSTNAME , FIRSTNAME )
AND R . MIDDLENAME = IFNULL ( @MIDDLENAME , MIDDLENAME )
AND R . DOB = IFNULL ( @DOB , DOB )
AND R . STREETNAME = IFNULL ( @STREETNAME , STREETNAME )
AND R . CITY = IFNULL ( @CITY , CITY )
AND R . STATE = IFNULL ( @STATE , STATE )
AND R . ZIPCODE = IFNULL ( @ZIPCODE , ZIPCODE )
AND R . SSN = IFNULL ( @SSN , SSN )
FETCH FIRST 500 ROWS ONLY )
AS T
WHERE ROW_NUM <= @MAXRECORDS
OPTIMIZE FOR 500 ROW ;
OPEN CR ;
RETURN ;
答案 0 :(得分:6)
为什么不这样做:
WHERE lower(LastName) = 'smith'
如果您担心性能(即查询不使用索引),请记住DB2有函数索引,您可以阅读here。基本上,您可以在upper(LastName)
上创建索引。
修改强> 要做我在评论中讨论的调试技术,你可以这样做:
create table log (msg varchar(100, dt date);
然后在您的SP中,您可以将消息插入此表以进行调试:
insert into log (msg, dt) select 'inside the SP', current_date from sysibm.sysdummy1;
然后在SP运行后,您可以从此日志表中选择以查看发生的情况。
答案 1 :(得分:3)
如果您希望在您的程序中不区分大小写,请尝试在其中使用此选项:
SET OPTION SRTSEQ = *LANGIDSHR ;
您还应创建一个索引以支持其性能。将*LANGIDSHR
作为连接属性时创建索引,然后共享权重索引可用于以后的作业。 (有多种方法可以使适当的设置生效。)
*LANGIDSHR
与您工作的语言ID有关。字符集中可能被视为“等于”的字符,例如“A”和“a”或“ü”和“u”,应该被赋予相等的权重(共享),因此可以一起选择。
答案 2 :(得分:0)
当我想要不区分大小写的搜索时,我做了类似的事情。我用了UPPER(mtfield) = 'SEARCHSTRING'
。我知道这很有效。
答案 3 :(得分:-1)
请参阅:https://stackoverflow.com/a/47181640/5507619
您可以在database creation设置数据库配置设置。不过,它基于unicode。
CREATE DATABASE yourDB USING COLLATE UCA500R1_S1
默认的Unicode排序规则算法由UCA500R1关键字实现,没有任何属性。由于默认UCA不能同时包含Unicode支持的每种语言的整理顺序,因此可以指定可选属性来自定义UCA排序。属性由下划线(_)字符分隔。 UCA500R1关键字和任何属性构成UCA归类名称。
“强度”属性确定在整理或比较文本字符串时是否考虑重音或大小写。在编写没有大小写或重音的系统时,Strength属性控制着类似的重要功能。 可能的值是:primary(1),secondary(2),tertiary(3),quaternary(4)和identity(I)。忽略:
- 重音和案例,使用主要强度等级
- 仅限案例,使用次要级别
- 既不是重音也不是情况,使用三级强度等级
几乎所有字符都可以通过前三个强度级别进行区分,因此在大多数区域设置中,默认的“强度”属性设置为第三级。但是,如果将Alternate属性(如下所述)设置为shift,则可以使用四元强度级别来破坏空格字符,标点符号和否则将被忽略的符号之间的联系。身份强度等级用于区分相似的字符,例如MATHEMATICAL BOLD SMALL A字符(U + 1D41A)和MATHEMATICAL ITALIC SMALL A字符(U + 1D44E)。
将Strength属性设置为更高级别将减慢文本字符串比较并增加排序键的长度。 例子:
- UCA500R1_S1将整理“role”=“Role”=“rôle”
- UCA500R1_S2将整理“role”=“Role”&lt; “角色”
- UCA500R1_S3将整理“角色”&lt; “角色”&lt; “角色”
这对我有用。如您所见,...... _ S2也忽略了案例。
使用newer standard version,它应如下所示:
CREATE DATABASE yourDB USING COLLATE CLDR181_S1
Collation keywords:
UCA400R1
= Unicode标准4.0 = CLDR版本1.2
UCA500R1
= Unicode标准5.0 = CLDR版本1.5.1
CLDR181
= Unicode标准5.2 = CLDR版本1.8.1
如果您的数据库已经创建,那么应该有change the setting的方式。
CALL SYSPROC.ADMIN_CMD( 'UPDATE DB CFG USING DB_COLLNAME UCA500R1_S1 ' );
我确实在执行此操作时遇到了问题,但据我所知,它应该可以正常工作。
其他选择例如是generating a upper case row:
CREATE TABLE t (
id INTEGER NOT NULL PRIMARY KEY,
str VARCHAR(500),
ucase_str VARCHAR(500) GENERATED ALWAYS AS ( UPPER(str) )
)@
INSERT INTO t(id, str)
VALUES ( 1, 'Some String' )@
SELECT * FROM t@
ID STR UCASE_STR
----------- ------------------------------------ ------------------------------------
1 Some String SOME STRING
1 record(s) selected.