一个 SQL 不会写,大佬帮帮忙

查看 144|回复 10
作者:imyasON   
假如查询 SELECT COUNT(1) FROM attendance_workday WHERE date_ymd LIKE '202401%'; 大于 0 库中有值 就执行 update 语句,否则 insert 插入语句,这样写会 like 12 次 '202401%', '202402%' ... '202412%'; 一共 12 个月.
updata 和 insert 语句 每个月份的都不一样,用 sql 脚本我该怎么写,用不了代码。
一月的
插入:
INSERT INTO attendance_workday (date_ymd, is_work)
VALUES
('20240101', '1'),
('20240102', '1'),
('20240103', '1'),
('20240104', '1'),
('20240105', '1'),
('20240106', '0'),
('20240107', '0'),
('20240108', '1'),
('20240109', '1'),
('20240110', '1'),
('20240111', '1'),
('20240112', '1'),
('20240113', '1'),
('20240114', '0'),
('20240115', '1'),
('20240116', '1'),
('20240117', '1'),
('20240118', '1'),
('20240119', '1'),
('20240120', '0'),
('20240121', '0'),
('20240122', '1'),
('20240123', '1'),
('20240124', '1'),
('20240125', '1'),
('20240126', '1'),
('20240127', '0'),
('20240128', '0'),
('20240129', '1'),
('20240130', '1'),
('20240131', '1');
更新:
UPDATE attendance_workday SET date_ymd = '20240101', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240102', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240103', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240104', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240105', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240106', is_work = '0';
UPDATE attendance_workday SET date_ymd = '20240107', is_work = '0';
UPDATE attendance_workday SET date_ymd = '20240108', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240109', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240110', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240111', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240112', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240113', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240114', is_work = '0';
UPDATE attendance_workday SET date_ymd = '20240115', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240116', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240117', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240118', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240119', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240120', is_work = '0';
UPDATE attendance_workday SET date_ymd = '20240121', is_work = '0';
UPDATE attendance_workday SET date_ymd = '20240122', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240123', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240124', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240125', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240126', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240127', is_work = '0';
UPDATE attendance_workday SET date_ymd = '20240128', is_work = '0';
UPDATE attendance_workday SET date_ymd = '20240129', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240130', is_work = '1';
UPDATE attendance_workday SET date_ymd = '20240131', is_work = '1';

date_ymd, is_work, update, set

hay313955795   
这要写存储过程呗。
为什么不用业务代码实现
aahao   
@ChatGPT
iyiluo   
gpt 啊,这种活干嘛不问 gpt
lsk569937453   
直接写代码实现。用 sql 实现的话后期维护够你喝一壶的
vhjxbc   
好的,我理解你的需求了。你想检查 attendance_workday 表中是否有某个特定月份(比如,2024 年 1 月)的记录。如果有记录,你想执行一个 UPDATE 语句;否则,你想执行一个 INSERT 语句。
下面是一个可以满足你需求的脚本:
sql
Copy code
DECLARE @MonthToCheck VARCHAR(6) = '202401'; -- 将此值更改为所需的月份
IF EXISTS (SELECT 1 FROM attendance_workday WHERE date_ymd LIKE @MonthToCheck + '%')
BEGIN
-- 更新语句
UPDATE attendance_workday
SET is_work = CASE
WHEN date_ymd = @MonthToCheck + '01' THEN '1'
WHEN date_ymd = @MonthToCheck + '02' THEN '1'
-- 依此类推,覆盖月份中的所有天
WHEN date_ymd = @MonthToCheck + '31' THEN '1'
END
WHERE date_ymd LIKE @MonthToCheck + '%';
END
ELSE
BEGIN
-- 插入语句
INSERT INTO attendance_workday (date_ymd, is_work)
VALUES
(@MonthToCheck + '01', '1'),
(@MonthToCheck + '02', '1'),
-- 依此类推,覆盖月份中的所有天
(@MonthToCheck + '31', '1');
END
在运行脚本之前,用实际的月份替换 @MonthToCheck 。这个脚本使用了条件性的 EXISTS 检查来判断表中是否存在指定月份的记录。如果存在记录,就执行 UPDATE 语句;否则,执行 INSERT 语句。脚本中包含了月份中每一天的占位符,你需要根据实际情况调整。
dog82   
不是有 ON DUPLICATE KEY 和 merge 语法么,看能不能用上
rxmt   
GPT 侠帮你问了。。
要在 SQL 脚本中实现您描述的功能,可以使用一个控制流程结构来先检查每个月份是否存在数据,然后根据检查结果执行相应的 INSERT 或 UPDATE 操作。但请注意,SQL 本身并不直接支持循环或条件分支,这通常是通过存储过程或脚本语言来实现的。下面是一个简化的示例,说明如何为一个月份实现这个过程。
sql
Copy code
-- 检查 2024 年 1 月的数据是否存在
DECLARE @count INT;
SELECT @count = COUNT(1) FROM attendance_workday WHERE date_ymd LIKE '202401%';
-- 根据结果执行相应操作
IF @count > 0
BEGIN
-- 数据存在时,执行更新操作
UPDATE attendance_workday SET is_work = '1' WHERE date_ymd = '20240101';
-- ... 后续更新操作
END
ELSE
BEGIN
-- 数据不存在时,执行插入操作
INSERT INTO attendance_workday (date_ymd, is_work)
VALUES
('20240101', '1'),
-- ... 后续插入操作
('20240131', '1');
END
这个示例是在假设您使用的是支持 T-SQL (例如 SQL Server )的数据库系统。如果您使用的是其他类型的数据库系统(如 MySQL 、PostgreSQL 等),可能需要使用不同的语法。
此外,对于您描述的 12 个月份,您需要为每个月份重复这个过程。这可能导致代码量较大。为了简化这一过程,您可能需要考虑使用数据库的编程功能(如存储过程)或者将逻辑移动到应用程序代码中,这样可以更容易地实现循环和条件逻辑。
在实现此类操作时,请确保考虑事务的使用,以保持数据的一致性和完整性。如果您不熟悉高级 SQL 技巧或存储过程的编写,建议咨询熟悉数据库编程的专业人士。
corcre   
这不工作日历吗...
你有数据的话全都查到临时表里面开个游标然后在实体表里面 if exists update ..... else insert....不就好了, 一年的数据量才 365 天吧
lll5758   
啊?那还要后端干什么呢,直接连接数据库得了
您需要登录后才可以回帖 登录 | 立即注册

返回顶部