当WHERE匹配时,SQL + Powershell:Select语句对匹配行中的列执行更新

时间:2019-02-26 18:39:06

标签: sql powershell

我在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?***
}

1 个答案:

答案 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'