从列中读取逗号分隔值,并在 SQL 中同一查询的 where 条件中使用逗号分隔值

问题描述 投票:0回答:1

我有 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。预先感谢。

sql sqlite
1个回答
0
投票

根据评论是的。此列中只有 2 个元素 那么您可以

  1. 从 EMP_Range 列中提取各个值并进行比较,或者
  2. 将搜索值合并到 CSV 中

1 从 WHERE 子句的 EMP_Range 列中提取各个值

对于第一个,您可以利用 substrinstr 函数来提取两个部分/值

  1. 部分/值 1 将是 EMP_Range 的子字符串,从第一个字符到逗号之前的字符位置。
  2. 部分/值 2 将是逗号后面的 EMP_Range 的子字符串

所以你可以拥有

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';
  • 为简洁起见,省略了其他 WHERE 条件

2 合并两个搜索值

这只是使用

||
运算符 连接两个搜索值并在两者之间使用逗号进行连接。例如

SELECT EMPName,EMP_Range FROM table1 WHERE EMP_range = /*first value>>>>>*/'1'||','||/*last value>>>>>>*/'3';
  • 为简洁起见,省略了其他 WHERE 条件
  • 当然,这些值可以通过编程方式组合并作为单个值传递

演示

以下演示了各种范围,包括具有较大值的范围:-

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

上面的 DB Fiddle

© www.soinside.com 2019 - 2024. All rights reserved.