【问题标题】:Pass String to SQL Statement In Condition在条件中将字符串传递给 SQL 语句
【发布时间】:2016-11-14 12:11:38
【问题描述】:

我有一个具有以下格式值的字符串

A , B, C

我需要将它传递给 SQL 语句的条件为

SELECT * FROM mytable 
WHERE colname in ('A','B','C')

我该怎么做? 我没有使用 PreparedStatement,正在使用普通 SQL。

【问题讨论】:

  • 使用动态 SQL 可能会得到最好的结果
  • @RichBenner 还有哪些其他选择?
  • @RichBenner 我正在使用 Oracle 数据库。
  • 然后在你第一次询问时用 oracle 标记它,我们不介意读者。

标签: java sql oracle11g


【解决方案1】:

oracle 中,您可以使用regexp_substr 来实现此目的。见下文:

例如输入字符串是'A,B,C'

这可以通过将逗号分隔的字符串拆分为单独的字符串并将其传递给 IN 子句来实现。

首先,我们将形成一个查询,它将这个逗号分隔的字符串拆分,并将单个字符串作为行。

Select regexp_substr('A,B,C' ,'[^,]+', 1, level) from dual
                connect by regexp_substr('A,B,C' ,'[^,]+', 1, level is not null

上述查询遍历逗号分隔的字符串,搜索逗号 (,),然后通过将逗号视为分隔符来拆分字符串。每当遇到分隔符时,它将字符串作为一行返回。

我们可以将此查询传递给我们的选择语句以获得所需的输出。

SELECT * FROM mytable 
WHERE colname in (
                Select regexp_substr('A,B,C' ,'[^,]+', 1, level) from dual
                connect by regexp_substr('A,B,C' ,'[^,]+', 1, level) is not null )

【讨论】:

    【解决方案2】:

    你可以像下面这样使用,

    select * from mytable where col like 'A%'
    union
    select * from mytable where col like 'B%'
    union
    select * from mytable where col like 'C%';
    

    您还可以查看 oracle 10g REGEXP_LIKE 了解更多详细信息。

    Link for more Details on REGEXP_LIKE

    【讨论】:

    • 感谢您的解决方案,但我使用的是 Oracle 数据库
    【解决方案3】:

    您可以创建一个存储过程,并使用它来将字符串拆分为一个表:

    CREATE FUNCTION [dbo].[stringSplit]
    (
        @String NVARCHAR(4000),
        @Delimiter NCHAR(1)
    )
    RETURNS TABLE
    AS
    RETURN
    (
        WITH Split(stpos,endpos)
        AS(
            SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
        UNION ALL
        SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
            FROM Split
            WHERE endpos > 0
    )
    SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
        'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
    FROM Split
    )
    

    然后您可以像这样查询数据:

    SELECT * FROM mytable 
    WHERE colname in (SELECT DATA FROM dbo.stringSplit(colname, ','))
    

    此解决方案是为 MS SQL 编写的。

    【讨论】:

    • 我使用的是 Oracle 数据库,而不是 MS SQL
    • 感谢您的解决方案,但我使用的是 Oracle 数据库。
    【解决方案4】:

    您可以使用执行字符串。

    MSSql 语法:

    DECLARE  myColumns  @String NVARCHAR(4000) = 'A,B,C';
    
    EXECUTE 'SELECT '+ myColumns +' FROM mytable '
    

    【讨论】:

    • 感谢您的解决方案,但我使用的是 Oracle 数据库。
    猜你喜欢
    • 2013-06-10
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多