2010-06-15 8 views
1

J'ai une chaîne comme dans mon Excel VBA:If/Then dans Embedded SQL en VBA

strSQL = "SELECT * FROM Total WHERE (SimulationID = (" & TextBox1.Text & ") And Test1 = (" & Example & "))" 

Cependant, parfois test sera 'est nulle', ce qui rend la requête

And Example = is NULL 

Comment puis-je changer pour ajouter un if/then ou quelque chose à faire dire

And Example is null 

lorsque exemple a une valeur de « est nulle »?

Répondre

1

Je suggère de faire la comparaison NULL avant d'assembler l'instruction SQL strSQL. Si vous vérifiez au préalable la valeur de Example, vous pouvez modifier votre instruction strSQL en fonction de cette vérification.

EDIT:
En réponse aux premier et deuxième commentaire de Daniel ci-dessous, je serais toujours préférer ce qui suit plus de le faire en ligne:

Dim strSqlTail strSqlTail = ""

Si (Example1 = null) alors strSqlTail = "ET Example1 IS NULL"
Si (Example2 = null) alors strSqlTail = strSqlTail & "ET Example2 IS NULL"
Si (Example3 = null) alors strSqlTail = strSqlTail & « ET EST N Example3 ULL »

...

Note: Le strSqlTail peut être ce que SQL rendrait votre situation de travail que je ne comprends pas tout à fait ce qui est de l'échantillon interrogé.

+1

Oui, mais il y a en fait 3 'Exemples' différents Il y a donc 3 and, un pour les exemples 1, un pour l'exemple 2 et un pour l'exemple3. J'ai essayé de simplifier le code pour vous les gars. – Daniel

+0

Un simple si Example1 = 'est nul' ne fonctionnera pas. Ou je devrais faire 6 déclarations si, ce qui est clairement une mauvaise idée. Il doit être intégré dans le code. – Daniel

+0

-1 SQL dynamique est le mal. – onedaywhen

0

Une solution consiste à fusionner le null en utilisant une fonction COALESCE (ou si vous utilisez Access, la fonction Nz):

trSQL = "SELECT ..." & _ 
     " FROM Total" & _ 
     " WHERE SimulationID = " & TextBox1.Text & " & _ 
     " And Coalesce(Test1,"""") = "" & Example & """ 

Une meilleure façon serait d'inclure dynamiquement ou pas inclure l'ensemble basé sur une instruction And sur si Example avait une valeur ou pour remplacer Test Is Null lorsque Example n'avait pas de valeur. Donc, quelque chose comme:

Dim testElements() As Variant 
Dim vElement As Variant 
Redim testElements(6,1) 

testElements(0,0) = Example1 
testElements(0,1) = "Test1" 
testElements(1,0) = Example2 
testElements(1,1) = "Test2" 
... 

Dim elementIndex as Integer 
Dim colName As String 
Dim elementValue As Variant 

For elementIndex = 0 To UBound(testElements) 
    elementValue = testElement(elementIndex, 0) 
    colName = testElement(elementIndex, 1) 

    If Len(Nz(elementValue)) = 0 Then 
     trSQL = trSQL & " And " & colName & " = """ & Example1 & """ 
    Else 
     trSQL = trSQL & " And " & colName & " Is Null" 
    End If 
Next 
+0

Qu'est-ce qui vous fait penser qu'ils utilisent Access? – onedaywhen

+0

@onedaywhen - Bon point. Avoir ajusté. – Thomas

0

Vous venez de créer une fonction qui met le signe égal et dans l'espace avant le numéro si elle ne correspond pas à « est nul », et de modifier l'instruction d'affectation de chaîne appropriée, comme suit:

.
Public Function NullModString(Example As String) As String 

    If Example <> "is null" Then Example = "= " & Example 
    NullModString = Example 

End Function 


strSQL = "SELECT * FROM Total WHERE SimulationID = " & TextBox1.Text & _ 
     "And Test1 " & NullModString(Example) 

Notez que je ne comprenais pas pourquoi les parenthèses supplémentaires étaient là-bas, mais il serait simple de les remettre dans

+0

SQL dynamique est le mal. – onedaywhen

+0

@onedaywhen, alors quoi, l'objet sur SO est de répondre à la question OPs. –

-2

Tout d'abord, ne pas incorporer SQL dans VBA: difficile à maintenir , Injection SQL, etc. Utilisez un proc stocké du côté de la base de données (même Access a PROCEDURE s).

Deuxièmement, utilisez COALESCE (ou une logique équivalente) pour gérer votre «chaîne vide» correspond à la logique d'interface utilisateur NULL '. Vous ne dites pas quelle syntaxe SQL et vous n'avez pas posté de DLL de schéma, donc nous ne faisons que deviner ...

SQL Server:

CREATE PROCEDURE GetTotals 
@SimulationID INTEGER, 
@Test1 VARCHAR(20) = NULL 
AS 
SELECT * 
    FROM Total AS T1. 
WHERE T1.SimulationID = @SimulationID 
     AND COALESCE(T1.Test1, '') = COALESCE(@Test1, ''); 

Accès au moteur de base de données (Jet):

CREATE PROCEDURE GetTotals 
(
:SimulationID INTEGER, 
:Test1 VARCHAR(20) = NULL 
) 
AS 
SELECT * 
    FROM Total AS T1 
WHERE T1.SimulationID = :SimulationID 
     AND IIF(T1.Test1 IS NULL, '', T1.Test1) 
      = IIF(:Test1 IS NULL, '', :Test1); 

Ensuite, exécutez le proc en utilisant votre middleware (ADO, DAO, etc.) avec des objets de paramètres, en utilisant le vide chaîne (ou autre valeur 'magique') pour NULL.