使用IIF动态更改SQL语句

使用IIF动态更改SQL语句,sql,vba,ms-access,iif,Sql,Vba,Ms Access,Iif,这是一个非常简单的问题,但却让我困了好几个小时 我想把“性别”字段改成这样 如果性别为0,则为1 如果性别为1,则为2 这是我的代码: Private Sub Run_Click() Dim db As DAO.Database Dim queryDef As DAO.queryDef Dim sql As String Dim fields As Variant Set db = CurrentDb sql = "" fields =

这是一个非常简单的问题,但却让我困了好几个小时

我想把“性别”字段改成这样 如果性别为0,则为1 如果性别为1,则为2

这是我的代码:

Private Sub Run_Click()
    Dim db As DAO.Database
    Dim queryDef As DAO.queryDef
    Dim sql As String
    Dim fields As Variant

    Set db = CurrentDb
    sql = ""

    fields = Array("Name", "Gender", "Age")

    For Each queryDef In db.QueryDefs
        If queryDef.Name = "Q_List" Then
            db.QueryDefs.Delete "Q_List"
            Exit For
        End If
    Next

    sql = sql & "SELECT "
    For Each field In fields
        If field = "Gender" Then
            sql = sql & IIf([Gender] = 0, 1, 2) & " AS Gender, "
        Else
            sql = sql & "[" & field & "]" & ", "
        End If
    Next
    sql = Left(sql, Len(sql) - 2)
    sql = sql & " FROM T_Customer"
    Set queryDef = db.CreateQueryDef("Q_List", sql)

    DoCmd.TransferText acExportDelim, , "Q_List", "C:\customerdata\data.txt", True, , 65001

    MsgBox "Done!"

End Sub
问题是,IIF并不适用于所有的数据行,但如果字符串的性别等于0整数,那么它实际上会进行比较,而我的所有性别行都变成2。。。 生成的Sql如下所示:

SELECT T_Customer.[Name], 2 AS Gender, T_Customer.[Age] FROM T_Customer
需要帮忙吗

解决了

通过在sql语句中以字符串形式写入IIF,并使用相同的字段名,按如下方式写入:
IIf([tablemame].[Gender]=0,1,2)和“AS Gender”,我认为您省略了两个引号。if in对象循环后的行应为:

sql = sql & " IIf([Gender] = 0, 1, 2) " & " AS Gender, "
现在sql变量是

SELECT [Name],  IIf([Gender] = 0, 1, 2)  AS Gender, [Age] FROM T_Customer 

我想你省略了两个引号。if in对象循环后的行应为:

sql = sql & " IIf([Gender] = 0, 1, 2) " & " AS Gender, "
现在sql变量是

SELECT [Name],  IIf([Gender] = 0, 1, 2)  AS Gender, [Age] FROM T_Customer 

如果
Gender
只包含整数,为什么它是一个字符串?我认为vba试图进行字面上的比较,如“Gender”=0,这总是错误的,因此我的Gender字段都返回2,这有意义吗?如果它只包含整数,为什么
Gender
是一个字符串?我认为vba试图进行字面上的比较,如“Gender”=0,这总是错误的,因此我的性别字段都返回2,这有意义吗?我尝试了这个,结果在查询定义的选择列表中出现了一个错误,称为“由别名“性别”引起的循环引用”。(错误3103)“将别名更改为Gen或其他什么。哦,天哪,太简单了。这起作用了。我可以给我自己和所有非母语人士一个建议,阅读错误消息,不要放弃它…似乎通过将IIF设置为字符串,VBA将其注册到其sql条件对象中。我尝试了这个方法,但在查询定义的选择列表中,我得到了一个错误,说“循环引用由别名‘性别’引起”。(错误3103)“将别名更改为Gen或其他什么。哦,天哪,太简单了。这起作用了。我可以给我自己和所有非母语人士一个建议,阅读错误消息,不要丢弃它……看起来就像是通过将IIF设置为字符串,VBA将其注册到sql条件对象中。