我在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 |
对于“ FruitOrder” SQL列中包含的每个“ FruitNameInventory”数组项,我想将“ 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?***
}
答案 0 :(得分:2)
我想将“ FruitNameInventory”数组项的值附加到“ MatchInventory”列。指示库存匹配。
这仅仅是选择相关记录并处理字符串连接的问题。
尝试:
UPDATE
FRUITORDERDB
SET MatchInventory =
CASE
WHEN MatchInventory IS NULL THEN ?
ELSE CONCAT(MatchInventory, ',', ?)
END
WHERE FruitOrder LIKE CONCAT('%', ?, '%')
问号代表来自Powershell变量的值。
CONCAT()
和CASE
是大多数RDBMS支持的标准ANSI SQL关键字(当不可用时,通常具有相同的特定于供应商的功能)。
确保添加到该列的值尚不存在(例如,如果您多次运行查询),这也是一个好主意,为此,您可以更改WHERE
子句:< / p>
WHERE
FruitOrder LIKE CONCAT('%', ?, '%')
AND MatchInventory NOT LIKE CONCAT('%', ?, '%')
此外,让我提出一种替代的方法,以确保字符串是CSV列表的一部分:
WHERE CONCAT(',', FruitOrder, ',') LIKE CONCAT('%,', ?, ',%')
尽管效率较低,但在确保匹配 full 单词的意义上更安全(例如,当CSV字段包含类似'test,testing'
和您只在寻找'test'
。