如何对字符串中的ID运行查询?

bw_*_*ezi 0 sql string select

我有一个表A与此列:

  IDS(VARCHAR)
  1|56|23
Run Code Online (Sandbox Code Playgroud)

我需要运行此查询:

  select TEST from TEXTS where ID in ( select IDS from A where A.ID = xxx )
Run Code Online (Sandbox Code Playgroud)

TEXTS.ID是一个INTEGER.如何将字符串A.IDS拆分为多个用于连接的整数?

必须适用于MySQL和Oracle.SQL99首选.

ang*_*son 6

首先,您不应该在列中存储这样的数据.你应该把它拆分成一个单独的表,然后你会有一个正常的连接,而不是这个问题.

话虽如此,您需要做的是以下内容:

  1. 将数字转换为字符串
  2. 用它|(你的分隔符)字符填充它,在它之前和它之后(我会告诉你为什么在下面)
  3. 在使用相同的分隔符之前和之后填充您正在查找的文本
  4. 做一个LIKE就可以了

这会运行缓慢!

这是执行您想要的SQL(假设所有运算符和函数都在您的SQL方言中工作,您不会说这是什么类型的数据库引擎):

SELECT
    TEXT   -- assuming this was misspelt?
FROM
    TEXTS  -- and this as well?
    JOIN A ON
        '|' + A.IDS + '|' LIKE '%|' + CONVERT(TEXTS.ID) + '|%'
Run Code Online (Sandbox Code Playgroud)

之前和之后需要用分隔符填充两个的原因是:如果你正在寻找数字5怎么办?您需要确保它不会意外地符合56数字,因为它包含数字.

基本上,我们会这样做:

... '|1|56|23|' LIKE '%|56|%'
Run Code Online (Sandbox Code Playgroud)

如果A中只有一行,如果你这样做可能会运行得更快(但我不确定,你需要测量它):

SELECT
    TEXT   -- assuming this was misspelt?
FROM
    TEXTS  -- and this as well?
WHERE
    (SELECT '|' + IDS + '|' FROM A) LIKE '%|' + CONVERT(TEXTS.ID) + '|%'
Run Code Online (Sandbox Code Playgroud)

如果表中有很多行TEXTS,那么通过首先从A表中检索值,构造适当的SQL IN并使用它来增加代码来生成适当的SQL是值得的:

SELECT
    TEXT   -- assuming this was misspelt?
FROM
    TEXTS  -- and this as well?
WHERE
    ID IN (1, 56, 23)
Run Code Online (Sandbox Code Playgroud)

这将运行得更快,因为它现在可以使用此查询的索引.

如果您将A.ID作为列,并将值作为单独的行,则以下是您将如何执行查询:

SELECT
    TEXT   -- assuming this was misspelt?
FROM
    TEXTS  -- and this as well?
    INNER JOIN A ON TEXTS.ID = A.ID
Run Code Online (Sandbox Code Playgroud)

这将比前一个稍微慢一点,但在前一个中,您必须首先检索A.IDS,构建查询,并冒险生成必须编译的新执行计划.