Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL:如何制作;不区分大小写“;查询_Postgresql - Fatal编程技术网

PostgreSQL:如何制作;不区分大小写“;查询

PostgreSQL:如何制作;不区分大小写“;查询,postgresql,Postgresql,有没有办法在PostgreSQL中编写不区分大小写的查询,例如,我希望下面3个查询返回相同的结果 SELECT id FROM groups where name='administrator' SELECT id FROM groups where name='ADMINISTRATOR' SELECT id FROM groups where name='Administrator' 在比较之前,使用函数将字符串转换为小写 试试这个: SELECT id FROM groups

有没有办法在PostgreSQL中编写不区分大小写的查询,例如,我希望下面3个查询返回相同的结果

SELECT id FROM groups where name='administrator'

SELECT id FROM groups where name='ADMINISTRATOR'

SELECT id FROM groups where name='Administrator'
在比较之前,使用函数将字符串转换为小写

试试这个:

SELECT id 
  FROM groups
 WHERE LOWER(name)=LOWER('Administrator')
在比较之前,使用函数将字符串转换为小写

试试这个:

SELECT id 
  FROM groups
 WHERE LOWER(name)=LOWER('Administrator')

最常见的方法是对搜索字符串和数据使用小写或大写。但这有两个问题

  • 它用英语工作,但不是所有语言。(甚至可能不在 不是每个小写字母都有对应的 大写字母;并非每个大写字母都有对应的 小写字母
  • 使用诸如lower()和upper()之类的函数将为您提供一个连续的 扫描它不能使用索引。在我的测试系统上,使用lower()需要 大约比可以使用索引的查询长2000倍。(测试数据的行数略超过10万行。)
  • 至少有三种使用频率较低的解决方案可能更有效

  • 使用,它主要模仿不区分大小写的数据类型的行为。加载该模块后,您可以通过
    createindex-ON-groups(name::citext)创建不区分大小写的索引。(但请参见下文。)
  • 使用不区分大小写的排序规则。这是在初始化时设置的 数据库使用不区分大小写的排序规则意味着您可以接受 客户机代码中的任何格式,您仍将返回 有用的结果。(这也意味着你不能进行区分大小写的查询。Duh。)
  • 创建一个函数索引。使用
    Create创建一个小写索引
    分组索引(下(名称))。这样做之后,您可以利用
    包含以下查询的索引的名称:
    SELECT id FROM groups,其中LOWER(name)=LOWER('ADMINISTRATOR'),或
    从以下组中选择id(名称)=“管理员”必须记住使用LOWER()


  • citext模块不提供真正的不区分大小写的数据类型。相反,它的行为就像每个字符串都是小写的。也就是说,它的行为就像您对每个字符串调用了
    lower()
    ,如上面的数字3所示。优点是程序员不必记住使用小写字符串。但是,在决定使用citext之前,您需要阅读文档中的“字符串比较行为”和“限制”部分。

    最常见的方法是将搜索字符串和数据以小写或大写形式显示。但这有两个问题

  • 它用英语工作,但不是所有语言。(甚至可能不在 不是每个小写字母都有对应的 大写字母;并非每个大写字母都有对应的 小写字母
  • 使用诸如lower()和upper()之类的函数将为您提供一个连续的 扫描它不能使用索引。在我的测试系统上,使用lower()需要 大约比可以使用索引的查询长2000倍。(测试数据的行数略超过10万行。)
  • 至少有三种使用频率较低的解决方案可能更有效

  • 使用,它主要模仿不区分大小写的数据类型的行为。加载该模块后,您可以通过
    createindex-ON-groups(name::citext)创建不区分大小写的索引。(但请参见下文。)
  • 使用不区分大小写的排序规则。这是在初始化时设置的 数据库使用不区分大小写的排序规则意味着您可以接受 客户机代码中的任何格式,您仍将返回 有用的结果。(这也意味着你不能进行区分大小写的查询。Duh。)
  • 创建一个函数索引。使用
    Create创建一个小写索引
    分组索引(下(名称))。这样做之后,您可以利用
    包含以下查询的索引的名称:
    SELECT id FROM groups,其中LOWER(name)=LOWER('ADMINISTRATOR'),或
    从以下组中选择id(名称)=“管理员”必须记住使用LOWER()


  • citext模块不提供真正的不区分大小写的数据类型。相反,它的行为就像每个字符串都是小写的。也就是说,它的行为就像您对每个字符串调用了
    lower()
    ,如上面的数字3所示。优点是程序员不必记住使用小写字符串。但是,在决定使用citext之前,您需要阅读文档中的“字符串比较行为”和“限制”部分。

    您也可以阅读
    ILIKE
    关键字。它有时非常有用,尽管它不符合SQL标准。有关更多信息,请参见此处:

    您还可以阅读
    ILIKE
    关键字。它有时非常有用,尽管它不符合SQL标准。有关更多信息,请参见此处:

    您可以使用
    ILIKE
    。i、 e

    SELECT id FROM groups where name ILIKE 'administrator'
    

    您可以使用
    ILIKE
    。i、 e

    SELECT id FROM groups where name ILIKE 'administrator'
    

    使用
    ILIKE
    而不是
    LIKE

    SELECT id FROM groups WHERE name ILIKE 'Administrator'
    

    使用
    ILIKE
    而不是
    LIKE

    SELECT id FROM groups WHERE name ILIKE 'Administrator'
    

    还可以使用POSIX正则表达式,如

    SELECT id FROM groups where name ~* 'administrator'
    

    选择'asd'~*'asd'
    返回
    t

    您还可以使用POSIX正则表达式,如

    SELECT id FROM groups where name ~* 'administrator'
    

    选择'asd'~*'asd'
    返回
    t

    使用
    ~*
    可以大大提高性能,并具有INSTR的功能

    SELECT id FROM groups WHERE name ~* 'adm'
    

    返回名称包含或等于“adm”的行。

    使用
    ~*
    可以通过INSTR的功能大大提高性能

    SELECT id FROM groups WHERE name ~* 'adm'
    

    返回名称包含或等于“adm”的行。

    我喜欢这种情况下的工作:

    SELECT id 
      FROM groups
     WHERE name ILIKE 'Administrator'
    

    我喜欢这种情况下的工作:

    SELECT id 
      FROM groups
     WHERE name ILIKE 'Administrator'
    

    如果您的Postgres安装附带citext,请尝试citext类型。这是不区分大小写的文本,对于这个问题的新手来说,官方postgres文档包含这里给出的所有答案,以及一些其他选项。先生,请将接受的答案重新分配给@Arun所做的答案。它不那么复杂,在应用后也不会带来很多麻烦