【问题标题】:SQLite matching on partial integer部分整数上的 SQLite 匹配
【发布时间】:2018-08-11 10:24:42
【问题描述】:

我有以下代码:

sic_code = int(input("Filter by SIC code (1-4 digits)? Default is all: ")

# Connect to the database file
conn = sqlite3.connect(db)
c = conn.cursor()

sql = ("SELECT Name "
       "FROM stock_data "
       "WHERE SIC_Code = {sc}".format(sc=sic_code))

# Run SQL query
c.execute(sql)

这是 SIC 代码在数据库中的外观。

理想情况下,无论用户输入 7、73、737 还是 7372,我都希望匹配 7372。我尝试从匹配 4 位代码的简单查询开始,但我无法让它工作。该查询不返回任何行。没有 SIC 查询,一切正常。

SIC 列和用户输入变量都指定为整数。

提前感谢您的帮助。

【问题讨论】:

  • 试试这个 "SELECT Name " "FROM stock_data " "WHERE SIC_Code like "7%"

标签: python regex sqlite conditional


【解决方案1】:

您正在 sqlite 中寻找LIKE

您将%_LIKE 运算符一起使用

当你想匹配字符串的某些部分时,你使用%

h% 将匹配 hot , hell...

h_t 将匹配 hut,hit..

LIKE 适用于 VARCHAR 而不是 integer 所以如果您想使用 LIKE 匹配 integer 值,您必须将它们存储为 VARCHAR 然后使用

#input sic_code should be string
sic_code = input("Filter by SIC code (1-4 digits)? Default is all: ")
sic_code = sic_code + '%' #where SIC_code is stored as `VARCHAR`
SELECT Name FROM stock_data WHERE SIC_Code LIKE {sc}".format(sc=sic_code)

你可以使用CAST

#input sic_code should be string
sic_code = input("Filter by SIC code (1-4 digits)? Default is all: ")
sic_code = sic_code + '%' #where SIC_code is stored as `integer`
SELECT Name FROM stock_data WHERE CAST(SIC_Code as TEXT) LIKE 
                                   {sc}".format(sc=sic_code)

*我没有使用过cast,但阅读了文档。

【讨论】:

  • 我仍然有一个问题,我可以匹配完整的 4 位数字,但我不能使用 3%、35% 等。错误是:sqlite3.OperationalError: near "%": syntax error
  • 检查您的语法并检查以确保您使用 like 和 % 与 text 而不是 integer
  • 我相信我使用的是文本,我该如何验证?
  • @user3709511 using text as in,您将数字转换为文本还是将所有数字存储为文本?
【解决方案2】:

以上解决方案都不适合我。相反,我将 SQL 数据导出回 pandas 数据框并在那里应用正则表达式。

感谢您的所有帮助。

问候, 瑞恩

【讨论】:

    【解决方案3】:

    使用regexp_match() from SQLAlchemy 1.4:

    它也适用于整数类型的列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      • 1970-01-01
      • 2011-06-17
      • 2018-10-31
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      相关资源
      最近更新 更多