Если / Тогда в SQL Embedded в VBA - PullRequest
1 голос
/ 16 июня 2010

У меня есть такая строка в моем Excel VBA:

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

Однако иногда Test будет иметь значение "null", что делает запрос

And Example = is NULL

HowМогу ли я изменить его, чтобы добавить оператор if / then или что-то, чтобы оно говорило

And Example is null

, когда Example имеет значение "is null"?

Ответы [ 4 ]

1 голос
/ 16 июня 2010

Я бы предложил выполнить сравнение NULL перед сборкой оператора SQL strSQL. Если вы предварительно проверите значение Example, вы можете соответствующим образом изменить свой оператор strSQL на основе этой проверки.

EDIT:
В ответ на первый и второй комментарий Даниэля ниже, я все же предпочел бы следующее, вместо того чтобы делать это в строке:

Dim strSqlTail strSqlTail = ""

If (Example1 = Null) Тогда strSqlTail = "AND Example1 IS NULL"
If (Example2 = Null) Тогда strSqlTail = strSqlTail & "AND Example2 IS NULL"
If (Example3 = Null) Тогда strSqlTail = strSqlTail & "AND Example3 IS NULL"

...

Примечание: strSqlTail может быть любым SQL, из-за которого ваша ситуация будет работать, поскольку я не совсем понимаю, что запрашивается из примера.

0 голосов
/ 16 июня 2010

Во-первых, не встраивайте SQL в VBA: сложно поддерживать, SQL-инъекция и т. Д. Используйте сохраненный процесс на стороне базы данных (даже у Access есть PROCEDURE s).

Во-вторых, используйте COALESCE (или эквивалентная логика) для обработки вашей 'пустой строки соответствует NULL' логике пользовательского интерфейса.Вы не говорите, какой синтаксис SQL, и не разместили DLL схемы, поэтому мы просто догадываемся ...

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, '');

Access Database Engine (также известный как 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);

Затем выполните процедуру, используя ваше промежуточное ПО (ADO, DAO и т. Д.) С объектами Parameter, используя пустую строку (или другое «магическое» значение) для NULL.

0 голосов
/ 16 июня 2010

Вы просто создаете функцию, которая ставит знак равенства и пробел перед числом, если оно не равно «равно нулю», и соответствующим образом модифицируете оператор присваивания строки, например:

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)

Обратите внимание, что я не понимал, почему там были лишние скобки, но было бы просто вставить их обратно.

0 голосов
/ 16 июня 2010

Одним из решений является объединение нулей с помощью функции Coalesce (или, если используется Access, функция Nz):

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

Лучшим способом было бы динамическое включение или не включение всего * 1004.* оператор, основанный на том, было ли Example иметь значение или заменить Test Is Null, когда Example не имел значения.Так что-то похожее на:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...