sqlite 如何在sql中提取字符串的一部分?

izj3ouym  于 2022-12-13  发布在  SQLite
关注(0)|答案(4)|浏览(630)

我有下面的数据表(名称表1),我必须从每一行中提取英语部分,例如从第一行"教育部门“中。
| 识别码|名称名称名称|
| - -|- -|
| 一个|PK:“";英国:“2.教育部门”; SP:“部门教育”; GR:“2.教育部门”; FR:“2.教育部门”;|
| 2个|英国:“3.足球:俯仰/地面”; SP:“3.足球场”; GR:“3.足球场/博登”; NR:“3.足球毒素/毒素”; FR:“3.足球地形”;|
| 三个|JP:“"; GR:“1.施塔特:豪普斯特”; SP:“1.城市:主要城市/首都”;英国:“1.城市:主要城市/首都”; FR:“1.维尔:主要城市/首都”; NR:“1.作者:霍维比/霍维斯塔德”;印度:“";|
| 四个|AF:“"; IND:“"; GR:“4.安德雷”; SP:“4.其他”; FR:“"; NR:“4.安德烈”; FR:“4.其他国家”;英国:“4.其他”|
我希望结果1是这样的,但无法解决它:
| 识别码|名称名称名称|
| - -|- -|
| 一个|2.教育部门|
| 2个|3.足球:沥青/地面|
| 三个|1.城市:主城/首府|
| 四个|四、其他|
我正在尝试这种方法,但没有得到预期的结果:

SELECT SUBSTRING(LEFT(name, CHARINDEX(';', name) + 1, 100)
FROM table1
WHERE CHARINDEX('\[', name) = "2. Education Sector" OR CHARINDEX('\[', name) = "3. Football: pitch/ground" OR CHARINDEX('\[', name) = "1. City: main city/capital" OR CHARINDEX('\[', name) = "4. Others";

我期待结果2,但无法解决:
| 识别码|名称名称名称|
| - -|- -|
| 一个|教育部门|
| 2个|足球:球场/地面|
| 三个|城市:主城/首府|
| 四个|其他|
我正在尝试这种方式,但它没有得到我预期的结果:

SELECT SUBSTRING(LEFT(name, CHARINDEX(';', name) + 1, 100)
FROM table1
WHERE CHARINDEX('\[', name) = "Education Sector" OR CHARINDEX('\[', name) = "Football: pitch/ground" OR CHARINDEX('\[', name) = "City: main city/capital" OR CHARINDEX('\[', name) = "Others";

有什么建议吗?

j8yoct9x

j8yoct9x1#

因为您标记了sql-server,所以我可以提供以下简单的方法(假设您使用的是SQL Server和完全支持的版本):
我本来要删除这个答案,但我会把它留在这里,以防你可以利用它在SQLLite -我不熟悉的产品个人。

select Id, s.[Name]
from t
cross apply (
  select Trim(Replace(Replace([value], '"',''), 'UK:','')) 
  from string_split(Name, ';')
  where [value] like '%UK:%'
)s([Name]);

查看Demo Fiddle

mbyulnm0

mbyulnm02#

您可以尝试LEFTRIGHT的组合。
1.在Name列中查找“UK:“
1.使用RIGHTLEN获取以“UK:“”开头的所有内容
1.在剩余字符串中查找第一个“"-这是最后一个字符的位置
1.把所有的东西都举到拳头上“"--这就是你的结果

SELECT  ID,
        LEFT
        (
              RIGHT(Name, LEN(Name) - CHARINDEX('UK:"', Name) - 3)
             ,CHARINDEX(RIGHT(Name, LEN(Name) - CHARINDEX('UK:"', Name) - 3), '"') - 1 -- subtracting 3 to remove "UK:"; then finding closing quotation mark
         )
FROM table1

请注意,此解决方案假定字符串的结构始终相同:以'UK:“'开头,以'”'结尾。

kr98yfug

kr98yfug3#

我会这样做:

SELECT ID , SUBSTRING(name, CHARINDEX('UK', name)+4, CHARINDEX('"', name,CHARINDEX('UK', name)+4)-CHARINDEX('UK', name)-4) FROM table1
4si2a6ki

4si2a6ki4#

这个方法使用递归调用来拆分字符串的分隔符,然后从中选择。改编自this post
第一个'with'(通用表表达式)只设置测试数据(在这里像临时表一样使用)。第二个名为split的表达式解析分号上的字符串,生成由id和解析的字符串元素组成的行的CTE。取消注解后面的查询以查看。然后,最后一个查询选择以'UK'开头的行并返回内容。

with tbl(id, str) as (
  select 1, 'PK:"";UK:"2. Education Sector";SP:"Sector Educativo"; GR:"2. Bildungssektor";FR:"2. Secteur de l/éducation";'
  union ALL
  select 2, 'UK:"3. Football: pitch/ground";SP:"3. Campo de fútbol"; GR:"3. Fußballplatz/Boden";NR:"3. fotballbane/bane";FR:"3. Terrain de football";'
  union ALL
  select 3, 'JP:""; GR:"1. Stadt: Hauptstadt/Hauptstadt"; SP:"1. Ciudad: ciudad principal/capital"; UK:"1. City: main city/capital"; FR:"1. Ville : ville principale/capitale"; NR:"1. By: hovedby/hovedstad"; IND:"";'
  union all
  select 4, 'AF:""; IND:""; GR:"4. Andere"; SP:"4. Otras"; FR:""; NR:"4. Andre"; FR:"4. Les autres"; UK:"4. Others"'
  union ALL
  select 5, 'AF:""; IND:""; GR:"4. Andere"; SP:"4. Otras"; FR:""; NR:"4. Andre"; FR:"4. Les autres";'
  ),
split(id, word, csv) AS (
  SELECT 
    id, '', str ||';'
  from tbl
  UNION ALL 
  SELECT id,
    trim(substr(csv, 0, instr(csv, ';'))), 
    substr(csv, instr(csv, ';') + 1) 
  FROM split 
  WHERE csv != '' 
) 
-- Show splitting on delimiter
--SELECT id, word FROM split 
--WHERE word != ''
--order by id; 
SELECT id, substr(word, 5, length(word)-5) as UK_Result
FROM split 
WHERE word != ''
and word like '%UK%'
order by id; 

1   2. Education Sector
2   3. Football: pitch/ground
3   1. City: main city/capital
4   4. Others

相关问题