【问题标题】:How to retrieve data from SQL Server using pyodbc and Python?如何使用 pyodbc 和 Python 从 SQL Server 检索数据?
【发布时间】:2021-10-20 08:18:40
【问题描述】:

我有一个使用 pyodbc 包从 SQL Server 检索数据的 SQL 语句。

问题是查询没有返回所有数据,而是返回了几条记录。

例子:

CREATE TABLE [dbo].[t1]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [first] [nvarchar](50) NULL,
    [last] [nchar](50) NULL,
    [Rating] [int] NULL,

    CONSTRAINT [PK_t1] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
                WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                      IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

数据:

SQL 语句:

advanced_search_term_list =[]
     sql = (
             r"select ID, first, last, Rating "
             r"from dbo.t3 "
             r"where "
             r"(first LIKE CONCAT('%', ?, '%') OR ? IS NULL) AND "
             r"(last LIKE CONCAT('%', ?, '%') OR ? IS NULL) AND "
             r"(Rating = ? OR ? IS NULL)"   
          )       
    param1 = advanced_search_term_list[0]
    param2 = advanced_search_term_list[1]
    param3 = advanced_search_term_list[2]
    rows = cursor.execute(sql, [param1, param1, param2, param2, param3, param3]).fetchall()
    
    for row in rows:
              print(row.ID)
              print(row.first)
              print(row.last)
              print(row.Rating)

如果用户在没有任何用户输入的情况下运行此 SQL 语句,则预期输出是所有行。

但是,它只返回这些行:

【问题讨论】:

  • 这看起来您没有发送 NULL 值。例如,对于 param3 的值,您正在传递 0
  • 好的,为什么它只返回这些记录??我希望要么返回所有记录,要么什么都不返回
  • 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。
  • @DaleK 对不起,我会尽力解决它
  • 当用户不输入任何内容时,上述参数的实际值是多少?请记住 ''0不是 NULL。我怀疑您实际传递的不是NULL(或Python 中的None),而是''''0

标签: python sql sql-server


【解决方案1】:

基于 @Larnu 的 cmets,我通过添加 Rating 字段 parameter = 0 来编辑 sql 语句,如下行:

r"(Rating = ? OR ? IS NULL OR ? = 0)"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 2014-08-09
    • 2012-07-12
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多