Запрос к свободному текстовому полю

EDIT:
На самом деле, я запускаю запрос 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

person Nurkartiko    schedule 24.07.2013    source источник
comment
@MahmoudGamal извините, я использую функцию Coldfusion QueryNew для создания временной таблицы.   -  person Nurkartiko    schedule 24.07.2013
comment
RE: Я запустил другой URL-адрес команды и получил результат в виде XML-данных Это из той же базы данных MS SQL или внешнего источника, который вы не можете контролировать?   -  person Leigh    schedule 25.07.2013
comment
@Leigh да, это единственный способ получить данные   -  person Nurkartiko    schedule 26.07.2013
comment
@Nurkaritko - Угу, ладно. Поскольку вы все равно строите QoQ вручную, как насчет нормализации, как предложил Рик? Если нет, учитывая, что QoQ настолько рудиментарны (и элементы вашего списка имеют начальные пробелы, которые могут вызвать проблемы), я думаю, что ваш лучший вариант - перебирать строки по отдельности, как предложил Дэн.   -  person Leigh    schedule 26.07.2013


Ответы (2)


Я думаю, что вам больше повезет с программным кодом, чем с запросом запросов. Мой подход будет похож на это:

<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 для создания временной таблицы»

Другими словами, это не запрос к базе данных.

person Dan Bracuk    schedule 24.07.2013
comment
почему ListFirst(pagename) * 1, а не только ListFirst(pagename)? - person Matt Busche; 24.07.2013
comment
Потому что я не думал, что это сработает, и никогда не думал попробовать. После этого ‹cfdump var=#'01' is 1#› возвращает YES, так что это будет работать. - person Dan Bracuk; 24.07.2013
comment
Похоже, что ввод содержит начальные пробелы. Возможно, вы захотите добавить туда trim(), иначе сравнение не найдет совпадений для таких значений, как (space)01 Aaa. О радости строковых сравнений.. - person Leigh; 25.07.2013

Решение для MSSQL (надежное намеренно, функция синтаксического анализа может помочь вам нормализовать базу данных до чего-то более разумного)

Помогающие функции:

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)
person Ondrej Svejdar    schedule 24.07.2013