记一次sqlite与mysql查询
起因
客户想要将产品链接和产品型号导出来,本来是非常简单的事情,因为只涉及两个表格 ay_content,ay_content_sort关联一下就可以了
学习点
sqlite用不了的函数
连接字符串
在SQLite中,确实没有内置的
CONCAT
函数,但你可以使用||
运算符来连接字符串SQLite 不支持
INTO TEMP TABLE
语法,在 SQLite 中,我们可以使用CREATE TEMPORARY TABLE
来创建临时表sql语句的递归函数
1
2
3
4
5
6
7
8
9
10
11
12
13WITH RECURSIVE CategoryTree AS (
-- 选择根节点
SELECT scode
FROM ay_content_sort
WHERE scode = 12
UNION ALL
-- 递归地选择子节点
SELECT c.scode
FROM ay_content_sort c
JOIN CategoryTree ct ON c.pcode = ct.scode
)非空判断
1
2
3
4CASE
WHEN m.filename IS NOT NULL THEN m.filename
ELSE 'products_' || ifnull(m.scode, '') || ''
END长度判断
1
2
3
4CASE
WHEN length(IFNULL(content_filename, '')) > 0 THEN content_filename
ELSE IFNULL(id, '')
ENDIFNULL(expression1, expression2)
是一个在某些数据库系统(如MySQL)中使用的函数,用于处理可能的
NULL值。它的作用是如果
expression1为
NULL,则返回
expression2;否则,返回
expression1临时表创建和删除
1
2CREATE TEMPORARY TABLE temp_product_data AS
select * from ay_content;1
DROP TABLE temp_product_data;
调试思想
1
2
3
4CASE WHEN m.filename IS NULL THEN 'NULL' ELSE 'NOT NULL' END AS debug_s_filename,
CASE WHEN t.filename IS NULL THEN 'NULL' ELSE 'NOT NULL' END AS debug_c_filename,
length(IFNULL(m.filename, '')) AS len_sort_filename,
length(IFNULL(t.filename, '')) AS len_content_filename,正是调试出来,数据库里的字段看起来是空的,但是语句显示没有空,才改用长度来判断,最终解决了判断不出来的问题
结束
最后附上调试出来的SQL 语句
1 | -- Part 1: Create the temporary table with enhanced debug info |
上面的语句也可以不用临时表格来处理,精简成下面的语句
1 | WITH RECURSIVE CategoryTree AS ( |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Jack Chen的博客!