2011-02-28 16 views
15

¿Cuál es una forma apropiada de hacer startswith(expression) en SQL?SQL startswith (usando `LIKE`) en una expresión

Puedo hacerlo con LIKE ((expression) || '%'), pero no se ve muy bien para mí.

consulta completa está en forma:

SELECT …, (SELECT COUNT(*) 
      FROM post AS child 
      WHERE child.path LIKE (post.path || '%') 
      AND child.depth >= post.depth) 
FROM post WHERE … 

supongo que es preferible utilizar LIKE debido a la indexación DB para este caso.

+3

Estás escribiendo una consulta correlacionada y usted está preocupado acerca de cómo se ve como la cláusula? ¿Por qué demonios te importaría si la declaración se ve bien? Hay tres cosas de las que preocuparse en las declaraciones de SQl: ¿devuelve los resultados correctos, funciona bien? (Sugerencia de subconsultas correlacionadas a menudo no se deben evitar) y ¿es seguro? Se ve bien ni siquiera está cerca cuarto. – HLGEM

+0

Funciona tan bien como le sea posible (en realidad, esta subconsulta en particular solo se realiza para un subconjunto de todos los objetos devueltos utilizando CASE WHEN). Otras consideraciones tampoco son un gran problema, aunque en otros casos similares la preocupación por la seguridad podría dar como resultado la misma pregunta ('post.path' no está protegido, ¿no ?, ¿cómo podría escaparlo correctamente en tal caso? Por ahora se sabe para estar seguro sin embargo.) – HoverHell

+0

Sólo una pregunta. ¿Es posible en sus datos tener 'child.path LIKE (post.path || '%') Y child.depth

Respuesta

23

Simplemente use LIKE 'input%'. IE:

WHERE child.path LIKE post.path + '%' 

(Asumo que esto es para SQL Server, aunque esta sintaxis probablemente funciona en otros lugares)

+3

La sintaxis no funcionará en otras bases de datos porque + para la concatenación de cadenas es específica de Microsoft. Todos los DBMS que cumplen con las normas usan '||'. Pero aparte de eso, estoy de acuerdo en que la declaración debería funcionar en otros DBMS –

+2

Eso es lo que usé (y escribí lo mismo en la pregunta). – HoverHell

2

En SQL estándar, también se puede decir:

where position(post.path in child.path) = 0 

no sé si su RDBMS lo admite. PostgreSQL sí.

+0

Hm-mm, interesante. Pero, ¿no sería peor, probablemente por no usar la indexación de DB (para las sentencias LIKE que solo terminan con '%')? – HoverHell

+0

Muy posiblemente. Depende totalmente de si el planificador de consultas es lo suficientemente inteligente como para notar el '= 0' y darse cuenta de que se trata de una consulta de prefijo que se puede manejar con un índice (si hay un índice). Ciertamente, es muy poco probable que sea más rápido que la versión LIKE. –

0

Puede utilizar

where DATE LIKE '[(SELECT STR(YEAR(GETDATE())-1))]%'

WHERE child.path LIKE '[(SELECT STR(YEAR(GETDATE())-1))]%' (post.path || '%')

Cuestiones relacionadas