2016-03-14 3 views
1

Моя база данных - porstgres, и я пытаюсь написать запрос, который будет использоваться как или ~ (postgres regex). Я не мог написать этот запрос, используя on.Как использовать 'like' в запросе Anorm?

так вот что я пытался написать:

SQL(s"""SELECT id, name 
     |FROM my_table 
     |WHERE name ~ '^{name}'""") 
.on('name -> name).as(parser.*) 

Или:

SQL(s"""SELECT id, name 
     |FROM my_table 
     |WHERE name like '{name}%'""") 
.on('name -> name).as(parser.*) 

Код, который работает для меня не использовать дальше. И это выглядит следующим образом:

SQL(s"""SELECT id, name 
     |FROM my_table 
     |WHERE name """.concat(s"like '$name%'").as(parser.*) 

Есть ли лучший способ для достижения этой цели?

ответ

3

Когда имеющий ... '{param}' со значением строки, переданной с помощью .on, оператор JDBC, получают, как ... ''$strVal'', так как значение экранируются в соответствии JDBC.

Таким образом, одинарные кавычки должны быть удалены из инструкции SQL, а %, должны быть частью значения экранированной строки.

SQL("""SELECT id, name 
    |FROM my_table 
    |WHERE name like {name}""") 
    .on('name -> s"{name}%").as(parser.*) 

Кроме того, там строка Интерполяция бесполезно (SQL(s"...") должно быть SQL("...")), так как Anorm заполнитель не получают с использованием этого.

Если вы хотите использовать интерполяцию, было бы лучше использовать Anorm one.

SQL"""SELECT id, name 
    |FROM my_table 
    |WHERE name like ${name + "%"}""". 
    as(parser.*) 
+0

В случае, если кто-либо с трудом объяснил разницу между ними. Второй пример cchantep использует переменную 'name', если она находится в области видимости. Некоторые (включая меня) предпочитают прямо диктовать интерполяционные переменные 'on', но все, что плавает ваша лодка. – mienaikoe

+0

Интерполяция имеет лучшую производительность – cchantep

+0

в вашем первом фрагменте, если бы вы случайно имели значение '' name -> s "$ name%" '? – wwkudu

1

Я считаю, что проблема заключается в том, что вы пытаетесь передать параметр внутри строки.

Я имею в виду, что вместо WHERE name like '{name}%' это должно быть просто WHERE name like {name}.

SQL(s"""SELECT id, name 
     |FROM my_table 
     |WHERE name like {name}""") 
.on('name -> "foo%").as(parser.*)