mysql - 如何创建一个空视图(或数组)并稍后在其中插入数据?
问题描述
这是因为我正在创建一个生成项目的过程(通过调用另一个函数),然后最终需要返回给我一个包含所有值的数组类型的集合。
我想我可以用一个临时表或视图来做到这一点。
DROP PROCEDURE IF EXISTS getAllStrings $$
CREATE PROCEDURE getAllStrings(IN idString varchar(256), OUT finalSeparate VARCHAR(256))
BEGIN
SELECT LENGTH(idString) - LENGTH(REPLACE(idString, ',', '')) INTO @noOfCommas;
IF @noOfCommas = 0
THEN
SELECT idString;
ELSE
CREATE OR REPLACE VIEW v AS SELECT NULL AS SPLIT_VALUES WHERE FALSE;
SET @y = 1;
WHILE @y <= @noOfCommas DO
SELECT splitString(idString, ', ', @y) INTO @tempSeparate;
SET @y = @y + 1;
INSERT INTO v (SPLIT_VALUES) values(@tempSeparate);
END WHILE;
SELECT SPLIT_VALUES FROM v;
END IF;
END $$
它说
目标表 v 不可插入
我该怎么做?我什至尝试将算法更改为,merge
但没有奏效。
有表的可以,但我正在寻找一种可以更好地保存它的数据结构,也许是@json,我不知道。
DELIMITER $$
DROP FUNCTION IF EXISTS splitString $$
CREATE FUNCTION splitString (
x VARCHAR(255),
delim VARCHAR(12),
pos INT
)
RETURNS VARCHAR(255) deterministic
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
delim, '') $$
DROP PROCEDURE IF EXISTS getAllStrings $$
CREATE PROCEDURE getAllStrings(IN idString varchar(256), OUT finalSeparate VARCHAR(256))
BEGIN
SELECT LENGTH(idString) - LENGTH(REPLACE(idString, ', ', '')) INTO @noOfCommas;
IF @noOfCommas = 0
THEN
SELECT idString;
ELSE
DROP TABLE IF EXISTS TEMP_SEP_STRINGS;
CREATE TABLE IF NOT EXISTS TEMP_SEP_STRINGS( SPLIT_VALUES VARCHAR(256));
SET @y = 1;
WHILE @y <= @noOfCommas DO
SELECT splitString(idString, ', ', @y) INTO @tempSeparate;
SET @y = @y + 1;
INSERT INTO TEMP_SEP_STRINGS(SPLIT_VALUES) values(@tempSeparate);
END WHILE;
SELECT * FROM TEMP_SEP_STRINGS;
END IF;
END $$
CALL getAllStrings('b, a', @multiple);
解决方案
临时表对我来说是最好的选择。当会话结束或连接关闭时,它会被释放(尽管您可以在此之前将其删除)并且只会吞噬您提供的任何数据。
无需定义其列和内容,您可以通过SELECT
命令(例如SQL IN
操作员)在任何地方使用它。
一个例子:
CREATE TEMPORARY TABLE temp_table
SELECT tree_id FROM TREES WHERE fruit_type='Apple';
推荐阅读
- reactjs - Kubernetes 不等待 reactjs 加载
- python - 如何计算python中日期的滚动窗口期?
- object-detection - 可旋转边界框
- django - 插入新记录时如何向用户发送短信
- ios - Xcode 在导入 gradle 插件生成的 cocoapods 时显示 swift 编译器错误
- android - Google Play 控制台给出错误。“Произошлаошибка。Повторите попытку позже。”
- oauth-2.0 - 角度认证 OIDC;Azue B2C:从 Azure 获取令牌后获取用户配置文件加载并承诺未捕获的错误
- javascript - 编写这些函数以检查数字是否按升序/降序连续的更简洁的方法
- typescript - 根据第一个参数的值将第二个参数定义为条件类型
- entity-framework - 如何通过 Entity Framework Core 中的多对多额外列进行排序?