Sql 自由文本字段的查询

Sql 自由文本字段的查询,sql,coldfusion,qoq,Sql,Coldfusion,Qoq,编辑: 实际上,我运行了MSSQL查询,假设结果是: ID pagename 1 1 2 01 3 01, 15 然后,我运行另一个命令URL,并将结果作为xml数据获得,假设简单形式的结果是: 4 01, 01 Aaa, 15 5 02 6 03 7 100 8 101 9 115 使用coldfusion,我可以将两个数据合并到一个临时表中。所以,实际上,我使用的是QoQ,而不是数据库查询 结束编辑 我有一张这样的桌子 ID pagename 1

编辑: 实际上,我运行了MSSQL查询,假设结果是:

ID pagename 1 1 2 01 3 01, 15 然后,我运行另一个命令URL,并将结果作为xml数据获得,假设简单形式的结果是:

4 01, 01 Aaa, 15 5 02 6 03 7 100 8 101 9 115 使用coldfusion,我可以将两个数据合并到一个临时表中。所以,实际上,我使用的是QoQ,而不是数据库查询 结束编辑

我有一张这样的桌子

ID pagename 1 1 2 01 3 01, 15 4 01, 01 Aaa, 15 5 02 6 03 7 100 8 101 9 115 如果我想显示pagename=1,结果是

ID pagename 1 1 2 01 3 01, 15 4 01, 01 Aaa, 15
MSSQL的解决方案:健壮的。parselist函数可以帮助您将db规范化为更正常的状态

帮助功能:

CREATE FUNCTION [dbo].[udf_GetNumeric]
    (@strAlphaNumeric VARCHAR(256))
RETURNS VARCHAR(256)
AS
BEGIN
    DECLARE @intAlpha INT
    SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric)
    BEGIN
        WHILE @intAlpha > 0
        BEGIN
            SET @strAlphaNumeric = STUFF(@strAlphaNumeric, @intAlpha, 1, '' )
            SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric )
        END
    END
    RETURN ISNULL(@strAlphaNumeric,0)
END
GO

CREATE FUNCTION [dbo].[ParseList_IntAny]
(   
  @List nvarchar(1000)
)
RETURNS @Result TABLE (
  IntValue int not null
)
as
begin
  declare @Value nvarchar(20), @Position int
  select @List = LTRIM(RTRIM(@List))+ ','
  select @Position = CHARINDEX(',', @List, 1)

  if REPLACE(@List, ',', '') <> ''
  begin
    while @Position > 0
      begin
        select @Value = LTRIM(RTRIM(LEFT(@List, @Position - 1)))
        if @Value <> ''
        begin
          declare @IntValue int
          select @IntValue = dbo.udf_GetNumeric(@Value)
          insert into @Result(IntValue) values (@IntValue)
        end
        select @List = RIGHT(@List, LEN(@List) - @Position)
        select @Position = CHARINDEX(',', @List, 1)
      end
  end
  return
end
GO


declare @tmp table(ID int,  pagename nvarchar(400))
insert into @tmp
select 1,'1'
union select 2,'01'
union select 3,'01, 15'
union select 4,'01, 01 Aaa, 15'
union select 5,'02'
union select 6,'03'
union select 7,'100'
union select 8,'101'
union select 9,'115'

select * from @tmp
where exists(select top 1 1 from dbo.ParseList_IntAny(pagename) where IntValue = 1)

我认为编程代码比查询查询更幸运。我的方法类似于:

<cfset NewQuery = QueryNew("id,pagename","integer,varchar")>
<cfloop query = "ExistingQuery">
  <cfif ListFirst(pagename) EQ 1>
    code to add row and set cell values for NewQuery
  </cfif>
</cfloop>
请注意,对于那些阅读sql页面的读者,这是前面的评论:
@MahmoudGamal抱歉,我正在使用Coldfusion函数QueryNew创建临时表


换句话说,这不是一个数据库查询。

@MahmoudGamal抱歉,我正在使用Coldfusion函数创建临时表。RE:我运行另一个命令URL,并以xml数据的形式获得结果。它是来自同一个MS SQL数据库还是您无法控制的外部源?@Leigh是的,这是接收数据的唯一方法data@Nurkaritko-啊,好的。既然您正在手动构建QoQ,那么像Rick建议的那样进行规范化怎么样?如果没有-考虑到QoQ非常简单,并且列表元素有前导空格,这可能会导致问题,我认为最好的选择是像Dan建议的那样逐个循环行。为什么使用ListFirstpagename*1而不仅仅是ListFirstpagename?因为我认为这样做行不通,也从未想过尝试。完成此操作后,this返回YES,因此它将工作。看起来输入包含前导空格。可能需要在其中添加修剪,否则比较将找不到与space01 Aaa等值匹配的项。哦,弦比较的乐趣。。