DB2案例敏感性

时间:2010-10-11 16:53:46

标签: db2 ibm-midrange

我很难让我的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 ;

4 个答案:

答案 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.