SQL + Powershell: оператор Select, когда WHERE соответствует, выполняет обновление столбца в строке, которая соответствует - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть массив в powershell

$FruitNameInventory = Apple, Banana, Orange

У меня есть таблица в SQL

ID|Name |FruitOrder                           |MatchInventory
1 |Sarah|Apple, Banana, Orange, Peach, Mangoes|
2 |John |Apple, Banana                        |    
3 |Mary |Peach, Mangoes                       |
4 |Mark |Mangoes                              |

Для каждого элемента массива "FruitNameInventory", который содержится в столбце SQL "FruitOrder"Я хочу добавить значение элемента массива "FruitNameInventory" в столбец "MatchInventory".Указание инвентарных соответствий.

Вопрос: Могу ли я иметь один оператор SQL с выбором и обновлением?Пожалуйста, смотрите логику и дальнейшие объяснения:

Foreach ($FruitName in $FruitNameInventory){
SQL Query: "SELECT * FROM FRUITORDERDB
WHERE FruitOrder LIKE '%$FruitName%'
****How to add UPDATE statement into this, so I can update the 
    MatchInventory by appending $FruitName?***
}

1 Ответ

0 голосов
/ 26 февраля 2019

Я хочу добавить значение элемента массива "FruitNameInventory" в столбец "MatchInventory".Указание инвентарных соответствий.

Это всего лишь вопрос выбора соответствующей записи и обработки конкатенации строк.

Попробуйте:

UPDATE
FRUITORDERDB
SET MatchInventory = 
    CASE 
        WHEN MatchInventory IS NULL THEN ?
        ELSE CONCAT(MatchInventory, ',', ?)
    END
WHERE FruitOrder LIKE CONCAT('%', ?, '%')

Где знак вопросаобозначает значение, которое берется из вашей переменной Powershell.

CONCAT() и CASE - это стандартные ключевые слова ANSI SQL, которые поддерживаются большинством СУБД (когда они недоступны, обычно есть идентичные функции, специфичные для поставщика).

Также было бы неплохо убедиться, что значение, добавляемое в столбец, еще не существует (например, если вы выполняете запрос несколько раз), для этого вы можете изменить предложение WHERE.:

WHERE 
    FruitOrder LIKE CONCAT('%', ?, '%') 
    AND MatchInventory NOT LIKE CONCAT('%', ?, '%')

Кроме того, позвольте мне предложить альтернативный способ обеспечения того, чтобы строка была частью списка CSV:

WHERE CONCAT(',', FruitOrder, ',') LIKE CONCAT('%,', ?, ',%')

Хотя это выражение и менее эффективно, оно является более безопасным в смыслечто он обеспечивает совпадение слова full (например, он будет правильно обрабатывать случай, когда поле CSV содержит что-то вроде 'test,testing' и вы ищете 'test' наLY).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...