我有 3 个表要加入并获取一些记录。我在 TABLE1 中有一个列,其中有逗号分隔的值。我想将这些值分成两部分并将这些值放在 WHERE 子句中。例如,列值具有“1,3”值,我想拆分这些值并在 where 条件下使用它。
要求是根据这些逗号分隔值获取记录。我想根据该列值获取起始值为 1、最后值为 3 的记录。
我想编写一个查询来获取基于逗号分隔值的记录,但我不知道如何拆分列值并将逗号分隔值放入 where 子句中。
例如
SELECT EMPName, EMP_Range
FROM **TABLE1**
JOIN **TABLE2** ON TABLE1.T1Id = TABLE2.T2Id
JOIN **TABLE3** ON TABLE1.T1Id = TABLE3.T3Id
WHERE EMPKey = "CONDITION1" AND SALARY = 'CONDITION2' AND EMP_Range has first string as '1' AND Last String as '3'
如何在 SQL 中编写此条件(EMP_Range 第一个字符串为“1”,最后一个字符串为“3”)?
我最好的方法或 SQL 查询应该是什么。
我正在使用 SQLLite。预先感谢。
根据评论是的。此列中只有 2 个元素 那么您可以
1 从 WHERE 子句的 EMP_Range 列中提取各个值
对于第一个,您可以利用 substr 和 instr 函数来提取两个部分/值
所以你可以拥有
SELECT EMPName, EMP_Range FROM table1 WHERE substr(EMP_Range,1,instr(EMP_Range,',')-1) = '1' AND substr(EMP_Range,instr(EMP_RANGE,',')+1) = '3';
2 合并两个搜索值
这只是使用
||
运算符 连接两个搜索值并在两者之间使用逗号进行连接。例如
SELECT EMPName,EMP_Range FROM table1 WHERE EMP_range = /*first value>>>>>*/'1'||','||/*last value>>>>>>*/'3';
演示
以下演示了各种范围,包括具有较大值的范围:-
DROP TABLE IF EXISTS table1;
CREATE TABLE IF NOT EXISTS table1 (EMPId INTEGER PRIMARY KEY, EMPName TEXT, EMP_Range TEXT, Salary REAL);
INSERT OR IGNORE INTO table1 VALUES (1,'Andy','1,3',50000),(2,'Ros','2,3',60000),(3,'KC','3,3',45000),(4,'Keddy','1,3',35000);
/* Add a row with larger ranges */
INSERT OR IGNORE INTO table1 VALUES (null,'Fred','123456,987654',25000);
SELECT EMPName, EMP_Range FROM table1 WHERE substr(EMP_Range,1,instr(EMP_Range,',')-1) = '1' AND substr(EMP_Range,instr(EMP_RANGE,',')+1) = '3';
SELECT EMPName, EMP_Range FROM table1 WHERE substr(EMP_Range,1,instr(EMP_Range,',')-1) = '2' AND substr(EMP_Range,instr(EMP_RANGE,',')+1) = '3';
SELECT EMPName, EMP_Range FROM table1 WHERE substr(EMP_Range,1,instr(EMP_Range,',')-1) = '3' AND substr(EMP_Range,instr(EMP_RANGE,',')+1) = '3';
SELECT EMPName, EMP_Range FROM table1 WHERE substr(EMP_Range,1,instr(EMP_Range,',')-1) = '123456' AND substr(EMP_Range,instr(EMP_RANGE,',')+1) = '987654';
/**/
SELECT EMPName,EMP_Range FROM table1 WHERE EMP_range = /*first value>>>>>*/'1'||','||/*last value>>>>>>*/'3';
SELECT EMPName,EMP_Range FROM table1 WHERE EMP_range = /*first value>>>>>*/'2'||','||/*last value>>>>>>*/'3';
SELECT EMPName,EMP_Range FROM table1 WHERE EMP_range = /*first value>>>>>*/'3'||','||/*last value>>>>>>*/'3';
SELECT EMPName,EMP_Range FROM table1 WHERE EMP_range = /*first value>>>>>*/'123456'||','||/*last value>>>>>>*/'987654';
/* Cleanup DEMO */
DROP TABLE IF EXISTS table1;
这会产生 8 个结果(方法 1 为 4 个,方法 2 为 4 个):-
第一个
EMPName EMP_Range
Andy 1,3
Keddy 1,3
第二个
EMPName EMP_Range
Ros 2,3
第三个
EMPName EMP_Range
KC 3,3
第四个(范围更大)
EMPName EMP_Range
Fred 123456,987654
第五个(结合搜索参数),即与第一个结果相同
EMPName EMP_Range
Andy 1,3
Keddy 1,3
第六个,与第二个相同
EMPName EMP_Range
Ros 2,3
第七个,与第三个相同
EMPName EMP_Range
KC 3,3
最后是第八个,与第四个相同
EMPName EMP_Range
Fred 123456,987654