【问题标题】:How do I find the position of a character in a SQLite column?如何在 SQLite 列中找到字符的位置?
【发布时间】:2020-04-25 16:41:14
【问题描述】:

如果结果为“joe@stackoverflow.com”并且我想找到@ 符号的位置(3)。可能吗? SQLite 似乎没有与INSTRLOCATEPOSITION 或任何此类功能等效的功能。

SELECT ?('joe@stackoverflow.com')

更新我最终注册了一个自定义扩展功能,但很惊讶我必须这样做。

【问题讨论】:

  • 能否分享一下您的解决方案

标签: sql sqlite


【解决方案1】:

从路径中检索文件名:

select replace(path, rtrim(path, replace(path, '/', '' ) ), '') from example;

来自http://community.spiceworks.com/topic/38836-sqlite-question-how-do-i-find-the-position-of-a-character-in-a-string?page=2,希望对大家有所帮助。

【讨论】:

  • 这是一个巧妙的技巧,如何在 3.7.15 版本中不添加 instr 函数的情况下做到这一点。
  • 智能替代方式
【解决方案2】:

不知道这是否是最近添加的,但INSTR function 确实会找到第一个实例。

【讨论】:

  • 在问题发布后发布的 3.7.15 中添加。 sqlite.org/changes.html#version_3_7_15
  • 同意:尽管如此,这对于已经用 Google 搜索过的人来说是正确的答案,不是吗?
  • 是的。就像通过搜索到达这里的我一样
【解决方案3】:

从表中选择 instr(COLUMN, '@')

【讨论】:

【解决方案4】:

如您所见here,charindex 不在 SQLite 标准包中(至少在我使用的 3.6.2 版本中)。但是this extension(extension-functions.c)有Charindex,和VB的instr基本一样。

将这些函数添加到 sqlite:

我们必须编译C源代码来制作sqlite扩展(假设你在Windows上):

  • 安装mingw编译器,小巧易做。

  • 将 sqlite3.h 复制到同一个文件夹

  • gcc -fPIC -lm -shared extension-functions.c -o libsqlitefunctions.dll

  • 启动 sqlite

  • 选择 load_extension('libsqlitefunctions.dll')

还有其他字符串和数学函数。

【讨论】:

【解决方案5】:

a spiceworks posting得到这个:

第一步是删除直到特定字符的所有字符 使用 ltrim 或 rtrim。如果您正在检索文件名,那么您修剪 所有不是斜线的字符。如果您要检索用户名 然后你修剪所有不是@字符的东西。然后你可以使用 在替换函数中修剪字符串以替换其出现 带有一个空字符串。这将为您提供每一个角色 你只是在第一步中修剪。换句话说,用户名或 文件名。

create table example (path varchar(256), email varchar(128));

insert into example values ('/path/to/file1.txt', 'user@domain.com');

从电子邮件中检索用户:

select replace(email, ltrim(email, '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM!#$%^&*()_+-=`~[]\/{}|;:,.<>?'),'') from example;

【讨论】:

    【解决方案6】:

    使用charindex('c', column, 0)

    这取决于 SQLite 的版本。

    【讨论】:

    • 这是sql server函数,不是sqlite
    【解决方案7】:

    我正在使用 Python,但这可以使用命令行工具来完成。

    此解决方案使用正则表达式提取日期:

    import re
    import sqlite3
    
    def get_date_from_path(item: str, expr: str):
        return re.search(pattern=expr, string=item).group()
    
    conn = sqlite3.connect(database=r'Name.db')
    conn.create_function("GET_DATE_FROM_PATH", 2, get_date_from_path)
    
    SELECT GET_DATE_FROM_PATH('C:\reports\report_20190731.csv', r'[0-9]{8}');
    

    【讨论】:

      【解决方案8】:
      SELECT 
         email,
         POSITION('@' IN email)
      From
         table
      

      这是您可能喜欢的基本资源:http://sqlzoo.net/howto/source/z.dir/tip238311/sqlite

      【讨论】:

      • 嗨,库鲁,库鲁。我最终构建了一个自定义扩展,但 POSITION 在我的 SQLite 构建中不可用。对你有用吗?
      • 可能的 SQL 语法错误:SELECT email, POSITION('[' IN email) FROM table [ near "table": syntax error ] 异常名称:NS_ERROR_FAILURE
      • 我不太喜欢 sqllite,但我猜方括号可能会给您带来麻烦,因为(我认为)sqllite 将它们视为特殊字符。尝试用双引号代替单引号——也许这样就可以了。
      【解决方案9】:

      char '@' 的位置可以通过函数 CHARINDEX (MSSQL) 找到:

      SELECT CHARINDEX('@', 'joe@stackoverflow.com', 0)
      

      【讨论】:

      • 我希望人们在回答之前先阅读问题,CHARINDEX 没有在 SQLITE 中实现!
      猜你喜欢
      • 2017-10-02
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      相关资源
      最近更新 更多